Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ - Fatal编程技术网

C++ 将此作为参数传递给C+中的成员+;

C++ 将此作为参数传递给C+中的成员+;,c++,C++,我想将此作为参数传递给成员变量,如下所示: template<class T> struct fun { fun(T* pointer) : memberPointer(pointer) { } T* memberPointer; }; struct gun { gun() : member(this) { } fun<gun> member; }; 模板 结构乐趣 { 乐趣(T*pointer):成员指

我想将此作为参数传递给成员变量,如下所示:

template<class T>
struct fun
{
    fun(T* pointer) : memberPointer(pointer)
    {
    }
    T* memberPointer;
};

struct gun
{
    gun() : member(this)
    {
    }
    fun<gun> member;
};
模板
结构乐趣
{
乐趣(T*pointer):成员指针(pointer)
{
}
T*memberPointer;
};
结构炮
{
gun():成员(此)
{
}
趣味会员;
};
在VisualStudio中,我有下一个警告:
警告C4355:“this”:用于基本成员初始值设定项列表


你能解释一下为什么这样做是错误的吗?我只是将指针存储在成员构造函数中,以便稍后使用它从
fun
调用一些
gun
函数。潜在的问题是
指向尚未完全构造的对象。例如,如果你有这个:

template<class T>
struct fun
{
    fun(T* pointer) : memberPointer(pointer)
    {
        memberPointer->callMethod(); //this is 2nd to execute
    }

    T* memberPointer;
};

struct gun
{
    gun() : member(this) //this is 1st to execute
    {
       ptr = new char(); // this is 4rd to execute unless earlier UB prevents execution
    }
    void callMethod()
    {
       printf("%s", ptr); //this is 3rd to execute, you get UB here
    }
   fun<gun> member;
   char* ptr;
};
模板
结构乐趣
{
乐趣(T*pointer):成员指针(pointer)
{
memberPointer->callMethod();//这是要执行的第二个
}
T*memberPointer;
};
结构炮
{
gun():member(this)//这是第一个执行的
{
ptr=new char();//这是第四次执行,除非较早的UB阻止执行
}
void callMethod()
{
printf(“%s”,ptr);//这是要执行的第三个命令,您在这里获得UB
}
趣味会员;
char*ptr;
};
您将遇到未定义的行为,因为您将传递指向未完全构造的对象的指针,其中只应传递指向完全构造的对象的指针。我故意用UB编写了一些蹩脚的代码,以便更具说服力。在现实生活中,UB不一定是个问题,有时所有对象都处于有效状态,因此会出现一些非常微妙的初始化顺序错误


那不是你的情况。您的情况很好-您不关心对象尚未完全构造。不过,在更改代码时,您应该小心,以免进入上述场景。

这只是一个警告。如果您要在fun构造函数中遵从
这个
,那么您将访问一个未初始化的对象。但是您没有,您只存储指针,因此可以忽略警告。如果要关闭警告,请将其添加到代码顶部

#pragma warning (disable: 4355)

这并不是完全错误的,但当您传递指针时,您的枪对象可能尚未完全构造。因此,您可能会调用依赖于对象完整构造的基类中的方法。

您想要的是实现静态多态性,最好通过。就你而言,你几乎做到了:

template<class Base>
struct fun : public Base
{
    void foo()
    {
        // call gun function
        Base::bar();
    }
};

struct gun : public fun<gun>
{
    void bar()
    {
        /*...*/
    }
};
模板
结构乐趣:公共基础
{
void foo()
{
//呼叫枪功能
Base::bar();
}
};
结构枪:公共娱乐
{
空条()
{
/*...*/
}
};

这不一定是错的。警告告诉您在构建对象之前可能正在使用
。由于您的
gun
类没有数据,并且您没有在
fun
构造函数中使用指针,因此在本例中看起来没有问题。这是一个相对愚蠢的警告,因为您所做的是一个常见的习惯用法。只需将
/wd4355
添加到命令行。(属性中还有一个条目:配置属性->C/C++->高级->禁用特定警告。)顺便说一句,“只有一个警告”并不意味着这不是一个严重的问题-编译器在许多情况下都可以发出警告(或什么也不做)。@Sharptoth有警告,也有警告。有些警告确实会警告潜在的严重问题。这不是他们中的一个。@JamesKanze:当然。我只想说“只是一个警告”并不意味着这不是一个严重的问题。你不知道。也许他想复制周围的
fun
,也许他不想,但从上面的例子看不出来。@MatthieuM。“…稍后使用它从
fun
调用一些
gun
函数”对我来说听起来真的像静态多态性。。。