关于C++包括另一个类

bao*_*hen 18 c++

我有两个文件:

File1.cpp
File2.cpp
Run Code Online (Sandbox Code Playgroud)

File1是我的主类,它有main方法,File2.cpp有一个类调用ClassTwo,我想在File1.cpp中创建一个ClassTwo对象

我一起编译它们

g++ -o myfile File1.cpp File2.cpp
Run Code Online (Sandbox Code Playgroud)

但是当我尝试创造时

//创建第二类对象

ClassTwo ctwo;
Run Code Online (Sandbox Code Playgroud)

它不起作用.

错误是

ClassTwo未在此范围内声明.

这是我的main.cpp

#include <iostream>
#include <string>
using namespace std;

int main()
{
//here compile error - undeclare ClassTwo in scope.
ClassTwo ctwo;

//some codes
}
Run Code Online (Sandbox Code Playgroud)

这是我的File2.cpp

#include <iostream>
#include <string>

using namespace std;

class ClassTwo
{
private:
string myType;
public:
void setType(string);
string getType();
};


void ClassTwo::setType(string sType)
{
myType = sType;
}

void ClassTwo::getType(float fVal)
{
return myType;
}
Run Code Online (Sandbox Code Playgroud)

得到了将我的File2.cpp拆分成另一个.h文件的响应但是如果我声明一个类,我如何将它拆分成另一个.h文件,因为我需要维护变量(私有)和函数的公共和私有(公共) )如何在main方法中将ClassTwo ctwo转换为File1.cpp

Alo*_*ave 45

您的代码中的基本问题是什么?

您的代码需要分离到接口(.h)和实现(.cpp).
编写类似的东西时,编译器需要查看类型的组合

ClassTwo obj;
Run Code Online (Sandbox Code Playgroud)

这是因为编译器需要为类型的对象保留足够的内存ClassTwo来执行此操作,因此需要查看其定义ClassTwo.在C++中执行此操作的最常见方法是将代码拆分为头文件和源文件.
类定义进入头文件,而类的实现进入源文件.通过这种方式,可以轻松地将头文件包含到其他源文件中,这些源文件需要查看他们创建的对象类的定义.

为什么我不能简单地将所有代码放在cpp文件中并将它们包含在其他文件中?

您不能简单地将所有代码放在源文件中,然后将该源文件包含在其他文件中.C++标准要求您可以根据需要多次声明实体,但只能定义一次(一个定义规则(ODR)) .包含源文件会违反ODR,因为在包含该文件的每个翻译单元中都会创建该实体的副本.

如何解决这个特殊问题?

您的代码应按如下方式组织:

// File1.h

Define ClassOne 
Run Code Online (Sandbox Code Playgroud)

// File2.h

#include <iostream>
#include <string>


class ClassTwo
{
private:
   string myType;
public:
   void setType(string);
   std::string getType();
}; 
Run Code Online (Sandbox Code Playgroud)

//File1.cpp

#include"File1.h"

Implementation of ClassOne 
Run Code Online (Sandbox Code Playgroud)

//File2.cpp

#include"File2.h"

void ClassTwo::setType(std::string sType)
{
    myType = sType;
}

void ClassTwo::getType(float fVal)
{
    return myType;
} 
Run Code Online (Sandbox Code Playgroud)

//main.cpp

#include <iostream>
#include <string>
#include "file1.h"
#include "file2.h"
using namespace std;

int main()
{

    ClassOne cone;
    ClassTwo ctwo;

    //some codes
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法,而不是包括头文件?

如果您的代码只需要创建指针而不是实际对象,那么您也可以使用正向声明,但请注意,使用正向声明会对如何使用该类型添加一些限制,因为编译器会将该类型视为不完整类型.

  • @baokychen:做一个?您应该在头文件中声明类/结构,并在实现文件(.cpp)中定义它们 (2认同)

S.C*_*sen 10

C++(和C就此而言)拆分了类型,函数和类的"声明"和"实现".您应该在头文件(.h或.hpp)中"声明"所需的类,并将相应的实现放在.cpp文件中.然后,当您希望在某处使用(访问)类时,#include相应的头文件.

ClassOne.hpp:

class ClassOne
{
public:
  ClassOne(); // note, no function body        
  int method(); // no body here either
private:
  int member;
};
Run Code Online (Sandbox Code Playgroud)

ClassOne.cpp:

#include "ClassOne.hpp"

// implementation of constructor
ClassOne::ClassOne()
 :member(0)
{}

// implementation of "method"
int ClassOne::method()
{
  return member++;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中:

#include "ClassOne.hpp" // Bring the ClassOne declaration into "view" of the compiler

int main(int argc, char* argv[])
{
  ClassOne c1;
  c1.method();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)