当没有单个整体文件时,将参数分隔为标题和实现文件的C ++ Struct构造函数将失败

时间:2018-12-11 18:50:05

标签: 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);
}

编译并运行后,将生成答案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;
    }
};

我曾经尝试使用#pragma,以及使用class而不是struct,但这没关系。这根本是错误的。我不明白为什么它可以在独立文件中使用,但是当分为标头和实现版本时却不能。我需要对头文件和实现文件做什么?

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

谢谢你,布莱恩。非常简单,但从根本上有效。

结果头文件:

 //Filename : test1.h
#pragma once

typedef struct T1{
 int result;
 T1(int var1, int var2);
}T1;

生成的实现文件:

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

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

生成的驱动程序文件:

//Filename drvr.cpp
#include <stdio.h>
#include "test1.h"

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

感谢大家对此进行讨论并发布解决方案。