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

C++ 如何在命名空间中使用在单独标头中定义的类

C++ 如何在命名空间中使用在单独标头中定义的类,c++,class,namespaces,reference,undefined,C++,Class,Namespaces,Reference,Undefined,我有一个命名空间,我想在其中定义一个类。该类相当复杂,因此我宁愿在单独的头文件中定义它,但即使是最简单的代码也会给我一个“undefined reference”错误 main.cpp #include <iostream> namespace A { #include "C.hpp" } int main() { A::C foo; std::cout << foo.member << std::endl; return 0

我有一个命名空间,我想在其中定义一个类。该类相当复杂,因此我宁愿在单独的头文件中定义它,但即使是最简单的代码也会给我一个“undefined reference”错误

main.cpp

#include <iostream>
namespace A {
    #include "C.hpp"
}

int main()
{
    A::C foo;
    std::cout << foo.member << std::endl;
    return 0;
}
C.cpp


当我运行
g++C.cpp main.cpp
时,我得到“main.cpp:(.text+0x10):未定义对`A::C::C()'的引用”错误。我认为构造函数的C::C()定义在某种程度上是错误的,但我不确定如何修复它。

您还必须在命名空间
A
中定义
C
的构造函数:

namespace A
{
    C::C()
    {
        this->member = 10;
    }
}

您还必须在命名空间
A
中定义
C
的构造函数:

namespace A
{
    C::C()
    {
        this->member = 10;
    }
}
这是一件非常奇怪的事情

这会将头中声明的所有内容放在名为
a
的命名空间中;具体地说,它为您提供了一个
a::C
的声明,该声明与包含头而不包含周围名称空间时得到的
::C
不同

您已经提供了
:C::C()
的定义;但是
main.cpp
需要
a::C::C()
的定义,因为它使用的是类。这在任何地方都没有定义,因此出现了错误

通过将名称空间移动到头文件(并修复
C.cpp
以使用该名称空间),将
C
正确地放入
名称空间A
,或者去掉
名称空间A

这是一件非常奇怪的事情

这会将头中声明的所有内容放在名为
a
的命名空间中;具体地说,它为您提供了一个
a::C
的声明,该声明与包含头而不包含周围名称空间时得到的
::C
不同

您已经提供了
:C::C()
的定义;但是
main.cpp
需要
a::C::C()
的定义,因为它使用的是类。这在任何地方都没有定义,因此出现了错误


通过将名称空间移动到头文件(并修复
C.cpp
以使用该名称空间),将
C
正确地放入
名称空间A
,或者删除
名称空间A

您的定义是错误的……我假设您这样做是因为您遇到了命名冲突。在这一点上,我只想说,“我希望你已经学到了在创建类时忽略名称空间的教训。你的定义是错误的……我假设你这样做是因为你遇到了命名冲突。在这一点上,我只想说,”我希望您已经吸取了在创建类时忽略名称空间的教训。因此,您必须事先确定类属于哪个名称空间。没有来自一个用户的
名称空间A{#include“C.hpp”}
和来自另一个用户的
名称空间B{#include“C.hpp”}
。除非类及其成员完全在标题中定义,尽管我也不建议这样做,因为两个用户最终会得到两个不同的类,它们恰好具有相同的定义。如果用户不喜欢类作者选择的名称空间,他们可以编写
名称空间a{typedef horrednamespace::C;}
名称空间a{using horrednamespace::C;}
。所以我要么在头中定义整个类,要么在名称空间之外包含它?如果类在名称空间之外没有太多用处,那么什么方法被认为是更好的方法?@Steve:或者干脆
名称空间a=horredNamespace
。事实上,如果您想要名称空间的全部内容。@user1134621:更好的方法是,您不应该在名称空间内编写
#include
。其中“从不”的意思是,“除非你做了一些我没有想到的,并且证明是正确的,非常模糊的事情”。您希望能够查看文件,并查看其中所有内容的完全限定名。如果有人后来出现,并通过从名称空间中包含名称空间在前面附加了一个名称空间,那么您就不能这样做。因此,您必须在前面确定该类属于哪个名称空间。没有来自一个用户的
名称空间A{#include“C.hpp”}
和来自另一个用户的
名称空间B{#include“C.hpp”}
。除非类及其成员完全在标题中定义,尽管我也不建议这样做,因为两个用户最终会得到两个不同的类,它们恰好具有相同的定义。如果用户不喜欢类作者选择的名称空间,他们可以编写
名称空间a{typedef horrednamespace::C;}
名称空间a{using horrednamespace::C;}
。所以我要么在头中定义整个类,要么在名称空间之外包含它?如果类在名称空间之外没有太多用处,那么什么方法被认为是更好的方法?@Steve:或者干脆
名称空间a=horredNamespace
。事实上,如果您想要名称空间的全部内容。@user1134621:更好的方法是,您不应该在名称空间内编写
#include
。其中“从不”的意思是,“除非你做了一些我没有想到的,并且证明是正确的,非常模糊的事情”。您希望能够查看文件,并查看其中所有内容的完全限定名。如果有人稍后出现,并通过从名称空间内部包含名称空间而在前面附加了一个名称空间,那么您就无法做到这一点。
namespace A
{
    C::C()
    {
        this->member = 10;
    }
}
namespace A {
    #include "C.hpp"
}