Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:初始化变量;重载隐式构造函数?_C++_Initialization - Fatal编程技术网

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

C++ C++;:初始化变量;重载隐式构造函数?,c++,initialization,C++,Initialization,我想重新实现一个我有头文件的库。 我不希望更改.h文件,因为这需要更改使用该库的程序(加上一些法律原因)。 编辑:我也不能更改使用库并实例化类X的代码 lib.h定义了一个类X(简化版本): (BOOL和INT只是库使用的一些数据类型,这些类封装了BOOL和INT的原始数据类型) 我在my_lib_implementation.cpp中实现了这个类: bool X::Function(BOOL q, INT p) { return true; } .h文件没有定义构造函数,因此这意味着

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

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

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

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

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

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

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

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

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

X x = {true, 0};

一个非常肮脏的攻击可能是在包含将X更改为X的库头文件之前定义一个预处理器宏。然后,您可以定义自己的X,该X继承自X_uu,并定义您喜欢的任何构造函数。您应该
#取消定义
包含
后的宏。如果你遇到了隐伏的bug,不要怪我。

真的没有办法直接满足你的要求。(提供默认构造函数,但不在类中声明。)

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


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

顺便问一下,这个标准有文档记录吗?我知道这种黑客行为,而且它在大多数编译器上都有效,我也知道为什么,但是这种行为是被定义的吗?@TC1它不是黑客行为,它是一种语言功能。它从C开始就存在了,可以安全使用。对不起,我的问题不清楚。我也不能真正更改调用库的代码。@user1302914那么你想要的是不可能的。好吧,这不好。我刚刚想到了一个备份计划:我可以从我的X::function(BOOL,INT)实现中调用一个静态函数(让我们称之为Z)来跟踪X对象是否已经初始化了吗?如果没有,那么x::Function(BOOL,INT)可以在开始常规执行之前先初始化。只有Z能够通过使用变量的地址区分不同的X实例,这在C中似乎是可能的??我知道这是非常低效的(函数会被调用数百万次:()但是像这样的方案会起作用吗?这可能会起作用,但这取决于问题是否说“不能更改调用它的代码”这意味着代码可以重新编译,但不能编辑,或者它是二进制的。显然,如果使用它的代码仅以编译形式提供,这将不起作用。我不确定这是否会越过明确更改库的界限(OP说这具有法律含义)@SoapBox好吧,您不必更改任何代码。您可以在名为库
.h
文件的
.h
文件中执行此操作。然后,您只需操作包含路径。如果代码以编译形式提供,则无法执行任何操作,因为构造函数可能已内联。@pmr很抱歉,我无法说到代码:)@enobayram我把“不能更改代码”理解为“没有实际的源代码,只有二进制代码”。您的答案要求使用新的头重新编译所有调用代码。如果调用的“代码”仅作为预编译的共享库或可执行文件提供,则可能无法执行。这取决于调用代码不能更改的原因。我没有想到这一点!但也不行。BOOL和INT也有隐式构造函数。
X::X()
{
    a=true;
    b=0;
}   
X x = {true, 0};