当单个单片文件没有时,C++ Struct Constructor与参数分隔成标题和实现文件失败

Kyl*_*leG 0 c++

我已经多次看到这个问题,但基本答案似乎是多次包含头文件.在我的情况下,这不是问题,我不知道是什么.

我有一个基本的c ++文件似乎在这里正常工作:

// Filename : t1.cpp
#include <stdio.h>

struct T1{
    int result;

    T1(int var1, int var2) {
        result = var1 * var2;
    }
};

void main(void){
    T1 t(2, 3);
    printf("%d\n", t.result);
}
Run Code Online (Sandbox Code Playgroud)

编译并运行时,会产生答案6.大.现在,当我将这段代码分成两个文件,一个.cpp和一个.h时,我得到错误(错误C2011:'T1':'struct'类型重定义).这两个不同的文件是这样的:

//Filename : test1.h
#ifndef TEST_H
#define TEST_H

struct T1{
    int result;

    T1(int var1, int var2);
};
#endif

//Filename : test1.cpp
#include "test1.h"

struct T1{
    int result;

    T1(int var1, int var2) {
        result = var1 * var2;
    }
};
Run Code Online (Sandbox Code Playgroud)

我曾经尝试过使用#pragma一次,以及使用class而不是struct,但这并不重要.这里有些根本错误.我不明白它为什么在独立文件中工作,但在分成标题和实现版本时却不行.我需要对标头和实现文件做些什么?

Bri*_*ian 6

在编写时struct T1 { /* ... */ };,您正在定义结构T1.结构应该只在每个翻译单元中定义一次,通常是将定义放入头文件并将该头文件包含到需要定义的每个翻译单元中.由于test1.cpp包含test1.h,它不应该尝试T1第二次定义.

相反,test1.cpp需要定义函数 T1::T1,该函数T1found in 的定义中声明test1.h,但尚未定义.要在声明成员函数的类定义之外定义成员函数,我们使用以下语法:

T1::T1(int var1, int var2) {
    result = var1 * var2; 
}
Run Code Online (Sandbox Code Playgroud)