如何在另一个源文件中访问结构体的静态成员

5
我正在创建一个小程序来进行计费。我试图在另一个源文件中访问在头文件中声明的静态成员 static double total。因为我的第一门语言是Java,所以我无法解决C++中的问题。
当我尝试时,我得到了以下错误:
bill.cpp(16): error C2655: 'BillItem::total': 定义或重新声明在当前作用域非法 bill.h(8): note: 参见“BillItem::total”的声明 bill.cpp(16): error C2086: 'double BillItem::total': 重定义 bill.h(8): note: 参见“total”的声明
如何使它可用?谷歌搜索这个错误没有帮助。
我想实现的是在结构体中创建一个静态双精度变量,该变量将对所有结构体实例通用。我需要在另一个源文件中访问这个静态变量,在那里我将进行计算。
Bill.h
#pragma once

struct BillItem
{
public:
    static double total;
    int quantity;
    double subTotal;
};

Bill.cpp

#include<iostream>
#include "Item.h"
#include "Bill.h" 

void createBill() {
    double BillItem::total = 10;
    cout << BillItem::total << endl;
}

MainCode.cpp

#include <iostream>
#include "Bill.h"

int main() {
    createBill();
    return 0;
}

这是你的全部代码吗?你的头文件中没有把double BillItem::total;放在结构体之外,对吧? - NathanOliver
在Bill.cpp文件中,从行double BillItem::total = 10;中删除double。类型名称仅在变量声明中使用,而不是每次引用时都使用。 - patatahooligan
不需要。我应该在同一个头文件中的结构体外添加它吗?Java是我的第一语言。我对C++很新,请问你能建议如何实现吗? - Anj Jo
@patatahooligan 当我删除double时,就会出现以下错误:error LNK2001: unresolved external symbol "public: static double BillItem::total" (?total@BillItem@@2NA)。 - Anj Jo
如果我理解你的问题正确的话,那个答案已经提到了解决方案:“你必须在类定义外定义你的静态成员并在那里提供初始化。” 这个定义需要在源文件中,而不是头文件中。 - underscore_d
显示剩余4条评论
1个回答

5
您没有声明总数。好吧,您已经在一个函数内部声明了,但它需要在函数范围之外:
#include<iostream>
#include "Item.h"
#include "Bill.h" 

double BillItem::total = 0;

void createBill() {
    BillItem::total = 10;
    cout << BillItem::total << endl;
}

这个可行。我以为我可以在函数内部将BillItem::total = 0;加倍。所以我应该像全局变量一样在函数外面写它。是这样吗? - Anj Jo
1
@AnjJo 没错。因为它是全局变量。只有一个,而且是全局的。 - nvoigt
为什么我们需要在函数范围之外进行声明? - skpro19
@skpro19 因为它被定义为那样。为什么呢?可能是因为它是一个全局变量,所以在函数内部声明它没有意义。如果你从不调用它呢?或者先调用另一个变量呢? - nvoigt

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