Редактировать: я только что придумал гораздо более простой способ задать этот вопрос:
Учитывая следующие две структуры:
class Thing {public: int a; public: int b; public: int c;} class Thing {public: int a, private: int b; public: int c;}
Гарантируется ли, что члены
a
,b
иc
будут находиться в памяти в одном и том же порядке для обоих этих определений?
Старый вопрос
Допустим, у нас есть этот код C++ в fileA.cpp
:
class Thing
{
public:
int a;
double num;
Thing()
{
b = 10;
}
float getB()
{
return b;
}
private:
float b;
Thing * other;
}
void doSomething(Thing thing);
int main()
{
Thing thing;
doSomething(thing);
std::cout << thing.b;
}
И допустим, у нас есть этот код в fileB.cpp
:
class Thing
{
public:
int a;
double num;
Thing()
{
b = 10;
}
float getB()
{
return b;
}
float b;
private:
Thing * other;
}
void doSomething(Thing thing)
{
thing.b = 30;
}
Предполагая, что компилятор не будет жаловаться, будет ли этот код работать так, как ожидалось? Таким образом, является ли расположение данных структуры независимым от того, являются ли определенные компоненты общедоступными, частными или защищенными?
Редактировать. Чтобы сделать это более очевидным, единственная разница между двумя определениями Thing
заключается в том, что float b;
является частным в fileA.cpp
, но общедоступным в fileB.cpp
.
friend
, или, что еще лучше, правильный объектно-ориентированный дизайн, чтобы избежать этой проблемы. - person tadman   schedule 10.10.2018