[解決済み] コンパイラエラー: このコンテキストではプライベートです
2022-02-08 03:26:54
質問
あるクラスを書いているのですが、コンパイルすると、"is private within this context"というエラーメッセージと、"invalid use of non-static data member"というエラーメッセージが表示されます。 しかし、cppファイルのaddShipment関数の前をすべてコメントアウトすると、うまくコンパイルできるようになります。 また、この2つの異なるタイプのエラーに関連性があるのかどうか、どなたか教えていただけないでしょうか。
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つ目は、静的メンバ変数と非静的メンバ変数を混同している点、2つ目は、最後の3つの関数がクラス宣言で宣言されているのに
Product::
ということで、同じ名前のフリースタンディング関数になっています。もし、これらの関数がメンバの定義であることを意図しているならば、それらを修飾してください。
1点目を解決するために、以下のようなクラスがあったとき。
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;
メンバ関数にも同じ規則が適用されます。
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::
が、2つ目のエラーの原因です。
という場合は 静的メンバ の概念を、ここで読み解きます。 http://en.cppreference.com/w/cpp/language/static
関連
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] どのような場合に '$this' よりも 'self' を使うべきですか?
-
[解決済み] 私的相続、公的相続、保護相続の違いについて
-
[解決済み] パブリック、プライベート、プロテクトの違いは何ですか?
-
[解決済み] Pythonにはクラス内に「プライベート」変数がある?
-
[解決済み] プライベートメソッドのユニットテストはどのように行うのですか?
-
[解決済み】Javaで異なるクラスからプライベートフィールドの値を読み取る方法は?
-
[解決済み】C++のクラスのprivateとprotectedのメンバの違いは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】変数やフィールドがvoid宣言されている