C ++:初始化变量;重载隐式构造函数?

时间:2012-03-30 09:44:46

标签: c++ initialization

我想重新实现一个我有头文件的库。 我宁愿不更改.h文件,因为这需要更改使用该库的程序(加上一些法律原因)。 编辑:我也无法更改使用库的代码并实例化类X!

lib.h定义了一个类X(简化版):

class X 
{
public:
    bool Function(BOOL q, INT p);
    BOOL a;
    INT b;
};

(BOOL和INT只是库使用的一些数据类型,这些类包装了原始数据类型bool和int)。

我在my_lib_implementation.cpp中实现了这个类:

bool X::Function(BOOL q, INT p)
{
    return true;
}

.h文件没有定义构造函数,所以这意味着有一个隐式构造函数(对吗?)。 问题是,我需要初始化变量a和b,以便我的Function(BOOL q,INT p)实现正常工作。 但是,如果我添加以下内容,则会出现编译错误("错误:隐式声明的定义' X :: X()'"",gcc 4.4):

X::X()
{
    a=true;
    b=0;
}   

是否有可能通过一些我不知道的魔法来重载构造函数?还有其他选项可用于初始化变量吗? 有一个库的实现(我不能使用),所以它似乎应该可能以某种方式?

本周我才开始编程C ++(我对其他语言有丰富的经验),所以这个问题可能只是我缺乏基础知识。 希望你们能帮助我!

3 个答案:

答案 0 :(得分:3)

不,这是不可能的,编译器生成的默认构造函数不能重载。

但是,您可以使用以下语法初始化成员:

X x = {true, 0};

答案 1 :(得分:2)

没有办法直接做你所要求的。 (提供默认构造函数而不在类中声明它。)

您最接近的方法是重新定义BOOLINT类,假设这些类已定义默认构造函数。如果有,那么您可以将默认值的含义更改为您想要的任何内容。

或者,您可以完全更改函数的行为。您可以向该类添加成员,包括例如跟踪函数是否已被调用的内容,或者多少次等等。或者您可以定义自己的betterthanX成员并将函数调用转发给该成员,然后将结果复制回真实X类的成员。

答案 2 :(得分:1)

非常脏的黑客可能是在包含将X更改为X_的库头文件之前定义预处理器宏。然后,您可以定义自己的X,它继承自X_并定义您喜欢的任何构造函数。您应该在#undef之后#include宏。如果你遇到阴险的错误,不要怪我。

相关问题