Вопрос о правилах доступа к неназванным классам в другом подклассе
Супер простая логика статистики потоков сетевых магазинов.
Родительский класс обрабатывает 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
Кто-нибудь мне поможет? ВотCMake
project @ godbolt.org воспроизводит проблему.
1 ответ
Ни в одном из ваших классов нет члена, и между вашими классами и именем «unnameStruct» нет никакой связи.
Переменная безымянного типа структуры неявноstatic
; если вы определитеstruct {} x;
в заголовке и включите этот заголовок в несколько файлов, вы обнаружите, что&x
отличается в каждом из этих файлов.
Итак, у вас есть четыре разные переменные с именем «unnameStruct», по одной в каждой единице перевода.
Каждыйincome
функция используетunnameStruct
переменная, определенная в своей собственной единице перевода, и вы увидите еще один результат, если добавитеunnameStruct.print("Main");
вmain
.