eroare de compilare: este privat în acest context (Programare, C++, Clasa, Privat)

AdamK a intrebat.

Scriu o clasă și când compilez, primesc un mesaj de eroare care spune „este privat în acest context” și un altul care spune „utilizarea invalidă a unui membru de date non-static”. Dar dacă comentez totul înainte de funcția addShipment din fișierul meu cpp, se compilează foarte bine. Poate cineva să îmi explice, vă rog, ce este diferit pentru ca uneori să provoace o eroare și alteori nu, și dacă cele două tipuri diferite de erori sunt legate.

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;
}

Comentarii

  • Includerea gratuită a <iostream>, , dar nu există nicio includere pentru <string> ? –  > Por Paul R.
2 răspunsuri
Fatih BAKIR

Sunt în principal 2 probleme în codul tău, în primul rând, confunzi variabilele membre statice și non-statice și în al doilea rând, ultimele 3 funcții sunt declarate în declarația clasei dar nu le-ai calificat cu Product:: astfel încât acestea sunt funcții independente cu aceleași nume. Dacă intenționați ca acestea să fie definiții ale membrilor, calificați-le.

Pentru a remedia primul punct, când aveți o clasă ca următoarea:

struct some_class
{
    int nonstatic_member;
    static int static_member;
}

Le accesați pe cele statice folosind funcția TypeName::MemberName sintaxa:

some_class::static_member = 5;

Cu toate acestea, atunci când un membru nu este static, aveți nevoie de o instanță a clasei respective pentru a accesa membrul:

some_class some_object;
some_object.nonstatic_member = 10;

Aceleași reguli se aplică și în cazul funcțiilor membre:

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
}

Din moment ce niciuna dintre variabilele membre nu este statică, utilizarea funcției Product:: peste tot este cauza celei de-a doua erori.

Dacă nu sunteți sigur de membru static concept, iată o lectură: http://en.cppreference.com/w/cpp/language/static

Joseph Thomson

Eroarea „privat în acest context” se referă la faptul că funcțiile addShipment, , reduceInventory și getPrice nu sunt membri sau prieteni ai clasei Product, , deci nu pot utiliza membrii privați ai acesteia.

Eroarea „invalid use of non-static data member” se referă la faptul că încercați să accesați membri de date non-statici, calificându-i cu ajutorul sintaxei Class::member, , care este modul în care se accesează static care sunt partajate de toate instanțele unei clase. Membrii de date non-statice sunt accesați folosind sintaxa object.member sau pointer->member, , deoarece există instanțe separate ale fiecărui membru de date pentru fiecare instanță a unei clase.

Și presupun că te referi la faptul că erorile dispar dacă comentezi totul după (și inclusiv) addShipment mai degrabă decât tot ceea ce se află înaintea ei. Acest lucru se datorează faptului că ambele tipuri de erori se referă la codul din cadrul funcțiilor nemembre.

Tags:, ,