指向成员对象的成员指针和声明顺序
Member pointer to member object and declaration order
#include <iostream>
class FooParent
{
public:
FooParent(int* new_p_bar)
{
p_bar = new_p_bar;
}
public:
int* p_bar;
};
class FooChild : public FooParent
{
public:
int bar;
public:
FooChild(int new_x)
:FooParent(&bar)
,bar(new_x) \ point of concern
{}
};
int main()
{
FooChild foo(8);
std::cout << foo.bar << std::endl;
}
上面的例子是我想要的。将指针p_bar
链接到bar
。但是,我担心的是,我所指向的成员的构造函数尚未被调用。
这个代码是否有效,或者标准对它有什么规定。如果没有,有什么替代方案。
注意:在我的应用程序bar
是一个对象Bar
(不是int
),这有什么影响吗?
如果你正在传递指针给成员,没有未定义的行为,直到你试图解引用它。如果您希望调用构造函数,请查看base-from-member
习惯用法http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Base-from-Member
看这个:
class FooParent {
public:
FooParent(int* new_p_bar)
{
p_bar = new_p_bar;
*p_bar = 99; // this has no sense
}
void set99() {
*p_bar = 99; // this - has
}
public:
int* p_bar;
};
class FooChild : public FooParent
{
public:
int bar;
public:
FooChild(int new_x)
:FooParent(&bar)
,bar(new_x) // point of concern
{}
};
int main()
{
FooChild foo( 42 );
std::cout << foo.bar << std::endl;
foo.set99();
std::cout << foo.bar << std::endl;
}
镜。
我的意思是,如果FooParent
的构造函数只存储指向外部int
(或Bar
-无关紧要)的指针,那么就没有问题了。
bar
的副本复制到FooParent
,就像这样
class FooParent
{
public:
FooParent(Bar new_p_bar)
{
p_bar = new_p_bar;
}
void set99() {
p_bar = 99; // this - has
}
public:
Bar p_bar;
};
class FooChild : public FooParent
{
public:
Bar bar;
public:
FooChild(Bar new_x)
:FooParent(bar)
,bar(new_x) // point of concern
{}
};
int main()
{
FooChild foo( 42 );
std::cout << foo.bar << std::endl;
foo.set99();
std::cout << foo.bar << std::endl;
}
镜。
这将不起作用。即使Bar
将具有复制c-tor或/和赋值操作符
相关文章:
- 按顺序声明的字符数组重叠
- 为什么结构属性声明和初始化顺序的行为是这样的?
- 类之外的 C++ 是保证为构造顺序的可变声明的顺序
- 重载函数声明的顺序在 c++ 中重要吗?
- C :使用声明和指令的顺序会影响选择
- 分割错误取决于我在C 中声明的顺序
- 当指定初始化程序的顺序和字段声明不一致时,clang可以删除函数调用
- Boost MPL-按顺序声明每种类型的类
- 如何按行主要顺序声明 3DArray
- 更改声明顺序时输出不正确
- GCC 警告初始化顺序与声明顺序不匹配
- 我们可以在 C 或 C++ 中打乱声明顺序吗?
- 如何根据方法实现的声明顺序对其进行排序
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 重载模板函数的声明顺序
- 为什么初始化列表顺序必须与成员声明顺序匹配
- c++声明顺序(const/type/function)
- c++:函数重载和声明顺序的混淆
- 指向成员对象的成员指针和声明顺序
- c++指针声明顺序输出分段错误或总线错误