我有一个名为myGraph
的类,它来自graph
如果我在调用构造函数时知道顶点的数量,我将能够使用以下构造函数。
myGraph(int numOfV) : graph(numOfV)
{
// initialize...
}
我想计算构造函数中的顶点数,然后继承构造函数中的graph
。怎么做?
myGraph(int a, int b)
{
/* using a,b to initialize...
a sequence of push operation on (vector<T>)verticeList */
int numOfV = this->verticeList.size();
// inherit...
myGraph(numOfV); // it will not work
}
请注意
我用来计算顶点数的过程很复杂。(多行代码而不是a+b
)
顶点的数量取决于myGraph
中的实例变量,因此我需要首先初始化myGraph
的成员,然后继承剩余的graph
部分。
答案 0 :(得分:3)
如果预初始化有很多逻辑,你可以在一个方法中将它分开:
struct myGraph
{
myGraph(int a, int b) : graph(myGraph::computeNoVertices(a,b))
{
}
static int computeNoVertices(int a, int b)
{
//whole chunk of code
}
};
答案 1 :(得分:2)
您必须在派生类的成员初始化列表中调用基类构造函数:
myGraph(int a, int b) :graph(a +b)
{ //^^It is OK to do computation when you pass parameters to
//base class constructor
// do something...
}
答案 2 :(得分:1)
使用C ++ 11,您可以执行以下有限的操作:
myGraph(int a, int b)
: myGraph(a+b)
{
}
如果您的计算要复杂得多,您可能希望将它们分解为单独的函数:
myGraph(int a,int b)
: myGraph(calculateNumOfV(a,b))
{
}
答案 3 :(得分:0)
顶点的数量取决于myGraph中的实例变量,因此我需要首先初始化myGraph的成员,然后继承其余的图形部分。
这是不可能的。 基础类始终在数据成员之前初始化。但是,在构造期间,您为成员分配的值仅取决于构造函数参数,因此基类&#39;构造函数参数也仅依赖于这些参数。
假设您有成员m1
和m2
,并希望使用依赖于这两个成员的值初始化基类,比如说f(m1,m2)
和g(m1,m2)
。您的构造函数具有参数a
,b
,c
,并且您使用m1
和{初始化m2
和x(a,b,c)
依赖于那些ctor参数{1}}。那么ctor应该是这样的:
y(a,b,c)
当然,为了提高可读性,您始终可以创建更多静态函数来计算基础对象的初始值设定项:
class Foo : Bar {
int m1;
int m2;
static int x(int a, int b, int c);
static int y(int a, int b, int c);
public:
Foo(int a, int b, int c)
: Bar( f(x(a,b,c), y(a,b,c)), g(x(a,b,c), y(a,b,c)) )
, m1(x(a,b,c))
, m2(y(a,b,c))
{}
};