2017-04-01 37 views
2

我正在寫一個類,當我編譯,我得到的說,「是在這一範圍內的私人」,另一個說,「無效使用非靜態數據的一個錯誤消息中的私人會員」。但是,如果我在CPP文件中addShipment功能之前註釋掉的一切,它編譯就好了。可有人請給我解釋一下什麼是不同的,有時產生一個錯誤,有時沒有,如果兩個不同類型的錯誤是相關的。編譯器錯誤:在這種背景下

Product.h:

#ifndef PRODUCT_H 
#define PRODUCT_H 

#include <iostream> 

class Product { 
    public: 
     Product(int productID, std::string productName); 
     std::string getDescription(); 
     void setDescription(std::string description); 
     std::string getName(); 
     int getID(); 
     int getNumberSold(); 
     double getTotalPaid(); 
     int getInventoryCount(); 
     void addShipment(int shipmentQuantity, double shipmentCost); 
     void reduceInventory(int purchaseQuantity); 
     double getPrice(); 
    private: 
     int productID; 
     std::string name; 
     std::string description; 
     double totalPaid; 
     int inventoryCount; 
     int numSold; 
}; 

#endif 

Product.cpp:

#include <iostream> 
#include "Product.h" 
using namespace std; 

Product::Product(int productID, string productName) { 
    Product::productID = productID; 
    Product::name = productName; 
} 

string Product::getDescription() { 
    return Product::description; 
} 

void Product::setDescription(string description) { 
    Product::description = description; 
} 

string Product::getName() { 
    return Product::name; 
} 

int Product::getID() { 
    return Product::productID; 
} 

int Product::getNumberSold() { 
    return Product::numSold; 
} 

double Product::getTotalPaid() { 
    if(Product::totalPaid < 1) { 
     totalPaid = 0; 
    } 
    return Product::totalPaid; 
} 

int Product::getInventoryCount() { 
    Product::inventoryCount = 0; 
    return Product::inventoryCount; 
} 

void addShipment(int shipmentQuantity, double shipmentCost) { 
    Product::inventoryCount = Product::inventoryCount + shipmentQuantity; 
    Product::totalPaid = Product::totalPaid + shipmentCost; 
} 

void reduceInventory(int purchaseQuantity) { 
    Product::inventoryCount = Product::inventoryCount - purchaseQuantity; 
    Product::numSold = Product::numSold + purchaseQuantity; 
} 

double getPrice() { 
    int price = (Product::totalPaid/static_cast<double>(Product::inventoryCount + Product::numSold)) * 1.25; 
    return price; 
} 
+1

無償列入'',還沒有包括''? –

回答

1

你的代碼中主要存在2個問題,首先,你混淆了靜態和非靜態成員變量,其次,你最後的3個函數是在類聲明中聲明的,但你沒有使用Product::來限定它們,所以它們是具有相同名稱的自由站立功能。如果您打算讓他們成爲成員的定義,請對其進行定性。

要解決的第一個點,當你有一個像下面這樣的類:

struct some_class 
{ 
    int nonstatic_member; 
    static int static_member; 
} 

您訪問使用TypeName::MemberName語法靜態的:

some_class::static_member = 5; 

然而,當一個成員不靜態的,你需要一個類的實例訪問該成員:

some_class some_object; 
some_object.nonstatic_member = 10; 

在S AME規則適用於成員函數還有:

void some_class::some_function() 
{ 
    some_class::nonstatic_member = 10; // error 
    this->nonstatic_member = 10; // fine 
    nonstatic_member = 10; // fine 

    static_member = 5; // fine 
    some_class::static_member = 5; // fine 
} 

由於沒有你的成員變量都是靜態的,你的Product::到處使用的是第二個錯誤的原因。

如果你不知道的靜態成員概念,這裏是一個讀:http://en.cppreference.com/w/cpp/language/static

1

「此範圍內的私人」 的錯誤指的是一個事實,即功能addShipmentreduceInventorygetPrice不是會員或類Product的朋友,所以他們不能使用它的私有成員。

「無效使用非靜態數據成員的」錯誤指的是事實,你試圖訪問使用語法Class::member,這是你如何訪問靜態數據成員進行限定的非靜態數據成員,這是由一個類的所有實例共享的。非靜態數據成員所使用的語法或object.member訪問pointer->member,作爲一類的每個實例存在的每個數據成員的單獨實例。

而且我認爲你的意思是,如果你之前後註釋掉一切(含)的addShipment功能,而不是一切錯誤消失。這是因爲這兩種錯誤都涉及到非成員函數中的代碼。