Вопрос о правилах доступа к неназванным классам в другом подклассе

Супер простая логика статистики потоков сетевых магазинов.

Родительский класс обрабатывает unname Object instance .

Родительский класс имеет другой подкласс.

В другом подклассе получите доступ к неназванному объекту родительского класса, я не знаю, почему два неназванных объекта являются одним и тем же.

а мне кажется они разные

Штаб-квартира в Китае

      /*=================> shope.h */
#pragma once

#include <iostream>
#include <string>
using namespace std;

struct {
  string flag = "init value";

  void print(string newFlag) {
    cout << "unnameStruct's adderss:" << this << '\t';
    cout << "flag's address:" << &flag << '\t';
    cout << "rawFlag:" << flag << '\t';
    flag = newFlag;
    cout << "newFlag:" << flag << '\t' << endl;
  }
} unnameStruct;


struct ChinaBaseShop {
  static double turnover; /* income flow */

  virtual void income(double money);
};

/*=================> shope.cpp */
#include "shope.h"

double ChinaBaseShop::turnover = {0.0};
void ChinaBaseShop::income(double money) {
  cout << "ChinaBaseShop's Address : " << this << endl;
  unnameStruct.print("Headquarters in China");
  turnover += money;
}

Пекинский магазин

      /*=================> beijing_shope.h */
#pragma once

#include "shope.h"

struct BeijingShop : ChinaBaseShop {
  virtual void income(double money) override ;
};


/*=================> beijing_shope.cpp */
#include "beijing_shope.h"

void BeijingShop::income(double money) /* override */ {
  cout << "-BeiJing–" << endl;
  cout << "BeijingShop's Address:" << this << endl;
  unnameStruct.print("BeiJing shope");
  ChinaBaseShop::income(money);
  if(money > 100) {
    /* Over 100 minus 10 */
    turnover -= 10.0;
  }
}

Тяньцзиньский магазин

      /*=================> tianjin_shope.h */
#pragma once

#include "shope.h"

struct TianjinShop : ChinaBaseShop {
  virtual void income(double money) override ;
};

/*=================> tianjin_shope.cpp */
#include "tianjin_shope.h"

void TianjinShop::income(double money) /* override */ {
  cout << "-TianJin–" << endl;
  cout << "TianjinShop's Address:" << this << endl;
  unnameStruct.print("TianJin shope ");
  ChinaBaseShop::income(money);
  if(money >= 100) {
      /* over 100 , 10% off */
      turnover -= (money / 10.0);
  }
}

основной файл

      #include "beijing_shope.h"
#include "tianjin_shope.h"

#include <iostream>
using namespace std;

int main() {
  BeijingShop beijingShop;
  TianjinShop tianjinShop;

  cout << "before open any shope : " << ChinaBaseShop::turnover << endl;

  beijingShop.income(20.0);

  cout << "after open BeiJing shope : " << ChinaBaseShop::turnover << endl;

  tianjinShop.income(30.0);

  cout << "after open TianJin shope : " << ChinaBaseShop::turnover << endl;

  return 0 ;
}

Смотрим вывод:

      g++ -std=c++20 -Wall beijing_shope.cpp  main.cpp  shope.cpp  tianjin_shope.cpp -o result.run && ./result.run

before open any shope : 0
-BeiJing–
BeijingShop's Address:0xffffef3323f8
unnameStruct's adderss:0xaaaac85d6108   flag's address:0xaaaac85d6108   rawFlag:init value      newFlag:BeiJing shope
ChinaBaseShop's Address : 0xffffef3323f8
unnameStruct's adderss:0xaaaac85d6160   flag's address:0xaaaac85d6160   rawFlag:init value      newFlag:Headquarters in China
after open BeiJing shope : 20
-TianJin–
TianjinShop's Address:0xffffef3323f0
unnameStruct's adderss:0xaaaac85d6188   flag's address:0xaaaac85d6188   rawFlag:init value      newFlag:TianJin shope 
ChinaBaseShop's Address : 0xffffef3323f0
unnameStruct's adderss:0xaaaac85d6160   flag's address:0xaaaac85d6160   rawFlag:Headquarters in China   newFlag:Headquarters in China
after open TianJin shope : 50

Шаг 1:

      # BeiJing shop instance  and Tianjin Shope instance are different instence , 
# It is reasonable that they are address different
BeijingShop's Address:0xffffef3323f8
TianjinShop's Address:0xffffef3323f0

Установка 2:

      # beijing_shope.h include shope.h , tianjin_shope.h include shope.h 
# It is reasonable that on different file unnameStruct's adderss are different 
unnameStruct's adderss:0xaaaac85d6108   flag's address:0xaaaac85d6108   rawFlag:init value      newFlag:BeiJing shope
unnameStruct's adderss:0xaaaac85d6188   flag's address:0xaaaac85d6188   rawFlag:init value      newFlag:TianJin shope 

Шаг 3:

      # On BeijingShop's instance , ChinaBaseShop::this the address is same with BeijingShop's instance . right .
# On TianjinShop's instance , ChinaBaseShop::this the address is same with TianjinShop's instance . right .
ChinaBaseShop's Address : 0xffffef3323f8
ChinaBaseShop's Address : 0xffffef3323f0

Шаг 4: Не так, как ожидалось

      # I can't understand the output
unnameStruct's adderss:0xaaaac85d6160   flag's address:0xaaaac85d6160   rawFlag:init value      newFlag:Headquarters in China
unnameStruct's adderss:0xaaaac85d6160   flag's address:0xaaaac85d6160   rawFlag:Headquarters in China   newFlag:Headquarters in China

# I think , BeijingShope's instance and TianjinShope's instance are different . 
# So , they super class handle different `unnameStruct` instance . 
# I think the output shoule like this :
unnameStruct's adderss:OneAddress       flag's address:OneAddress       rawFlag:init value      newFlag:Headquarters in China
unnameStruct's adderss:AnotherAddress   flag's address:AnotherAddress   rawFlag:init value      newFlag:Headquarters in China

Кто-нибудь мне поможет? ВотCMakeproject @ godbolt.org воспроизводит проблему.

1 ответ

Ни в одном из ваших классов нет члена, и между вашими классами и именем «unnameStruct» нет никакой связи.

Переменная безымянного типа структуры неявноstatic; если вы определитеstruct {} x;в заголовке и включите этот заголовок в несколько файлов, вы обнаружите, что&xотличается в каждом из этих файлов.

Итак, у вас есть четыре разные переменные с именем «unnameStruct», по одной в каждой единице перевода.
Каждыйincomeфункция используетunnameStructпеременная, определенная в своей собственной единице перевода, и вы увидите еще один результат, если добавитеunnameStruct.print("Main");вmain.

Другие вопросы по тегам