在头文件中定义并在cpp文件中实现的C++结构体

4
如何确保在另一个类中使用时,我实现的某个颜色(somecolor)保持其值? struct.h
struct Color{
   unsigned char r;
   unsigned char g;
   unsigned char b;
};
Color someColor;
//if i define the color here it says...:
Color someColor = {255,255,255}; //error: data member inializer not allowed

struct.cpp

struct::Color someColor = {255,255,255};

someotherclass.cpp

struct *str = new struct();
str->someColor.r //is not the correct value /not set

2
请展示真正的代码。您不能有一个名为 struct 的结构体。 - Joseph Mansfield
从最后一行来看,我认为我们缺少了关键信息,即someColor是一个类的成员,而不是全局变量。为了回答这个问题,我们需要知道(a)是否确实如此;(b)它应该与类本身关联一个实例(静态成员)还是与每个对象分别关联一个实例(非静态成员)。 - Mike Seymour
3个回答

6

您需要在头部进行声明

extern Color someColor;

并在 .cpp 文件中 定义

Color someColor = {255, 255, 255};

顺便提一下,你的语法struct::Color非常具有误导性。它被解析为struct ::Color,在C++术语中,它相当于::Color或只是Color(除非你在命名空间内)。


4

为了让它成为有效的C++代码,我将把你的struct重命名为mystruct。看起来你想要为mystruct提供一个默认构造函数,使其someColor成员初始化为{255,255,255}。在C++11之前,你需要这样做:

mystruct::mystruct()
{
  someColor.r = 255;
  someColor.g = 255;
  someColor.b = 255;
}

另外,如果您为Color创建一个接受3个值的构造函数,您可以这样做:

mystruct::mystruct()
  : someColor(255, 255, 255)
{ }

然而,在C++11中,您可以在成员初始化列表中进行聚合初始化,因此您不需要为mystruct提供构造函数:

mystruct::mystruct()
  : someColor{255, 255, 255}
{ }

事实上,在C++11中,你被允许像你所尝试的那样,在类定义内部初始化非静态非常量成员:
Color someColor = {255, 255, 255};

4

你应该这样写:

struct.h

struct Color{
   unsigned char r;
   unsigned char g;
   unsigned char b;
};
extern Color someColor;

struct.cpp

#include "struct.h"    
Color someColor = {255,255,255};

someotherclass.cpp

#include "struct.h"
Color newColor;
newColor.r = someColor.r;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接