pla*_*der 17 c++ constructor delayed-execution
我正在继承一个类,我想调用它的一个构造函数.但是,在调用它之前,我必须处理一些东西(不需要基类的任何东西).有什么办法我可以稍后调用它而不是在初始化列表中调用它吗?我相信这可以用Java和C#完成,但我不确定C++.
我需要在构造函数上传递的数据以后不能重新分配,所以我不能只调用默认构造函数并在以后初始化它.
Kon*_*lph 31
有什么办法我可以稍后调用它而不是在初始化列表中调用它吗?
你不能.必须在初始化程序列表中调用基类构造函数,并且必须首先调用它.
实际上,如果在那里省略它,编译器将隐式添加调用.
我相信这可以用Java和C#完成,但我不确定C++.
C#和Java都不允许这样做.
但是,您可以将方法作为基类构造函数调用的参数调用.然后在构造函数之前处理它:
class Derived {
public:
Derived() : Base(some_function()) { }
private:
static int some_function() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)
sbi*_*sbi 15
正如几个人回答说的那样,你不能延迟调用基类构造函数,但Konrad给出了一个很好的答案,可以很好地解决你的问题.但是,这确实有其缺点(例如,当您需要使用其计算共享中间结果的值初始化多个函数时),所以只需完成,这是通过使用它来解决固定初始化顺序问题的另一种方法.
鉴于初始化的固定顺序,如果你可以控制派生类(以及你怎么会改变其中一个ctors?),你可以偷偷进入私有基础,以便它在另一个之前被初始化base,然后可以使用私有库已经计算的值进行初始化:
class my_dirty_little_secret {
// friend class the_class;
public:
my_dirty_little_secret(const std::string& str)
{
// however that calculates x, y, and z from str I wouldn't know
}
int x;
std::string y;
float z;
};
class the_class : private my_dirty_little_secret // must be first, see ctor
, public the_other_base_class {
public:
the_class(const std::string str)
: my_dirty_little_secret(str)
, the_other_base_class(x, y, z)
{
}
// ...
};
Run Code Online (Sandbox Code Playgroud)
该my_dirty_little_secret班是一个私人的基础,这样的用户the_class不能使用它,它的所有的东西是私有的,也有明确的友谊只授予the_class访问它.但是,由于它在基类列表中首先列出,因此它将在之前可靠地构建the_other_base_class,因此无论它计算什么都可以用来初始化它.
基类列表中的一个很好的注释可以防止其他人通过重构来破坏事物.
| 归档时间: |
|
| 查看次数: |
8754 次 |
| 最近记录: |