1. ホーム
  2. c++

[解決済み] コンパイラエラー: このコンテキストではプライベートです

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