C ++ Доступ к элементу частного массива из функции друга (оператор <<) - PullRequest
0 голосов
/ 11 января 2019

У меня есть класс со следующим объявлением и сопутствующим определением:

friend ostream& operator<<(ostream& out, const Poly& poly);
ostream& operator<<(ostream& out, const Poly& poly) {}

и

private:
    int *polyArray;

Внутри кода для этой операторской функции у меня есть (среди прочего):

    if (poly.polyArray[i] != 0) {
        out << poly.polyArray[i];
    }

Я получаю следующее сообщение об ошибке из подчеркивания в моем компиляторе (Visual Studio), в частности под polyArray:

int *Poly::polyArray 
Member "Poly::polyArray" is inaccessible

Я могу нормально вызывать публичные функции-члены, и я думал, что смог получить доступ к приватным данным-членам из функции друга.

Есть идеи, почему я получаю эту ошибку?

Примечание: Ниже приведен более полный класс в соответствии с просьбой:

Сначала файл заголовка.

class Poly
{
public:
    Poly(int coeff, int expon);
    friend ostream& operator<<(ostream& out, const Poly& poly);
private:
    int *polyArray;
    int size;
};

Тогда реализация.

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

using namespace std;

Poly::Poly(int coeff, int expon) {
    size = expon + 1;
    polyArray = new int[size];
    for (int i = 0; i < size; ++i) {
        polyArray[i] = (i == expon ? coeff : 0);
    }
}

ostream& operator<<(ostream& out, const Poly& poly) {
    int currentSize = poly.getSize();
    // If Poly is "empty", print 0
    if (currentSize == 1 && poly.polyArray[0] == 0) {
        out << 0;
        return out;
    }
    for (int i = 0; i < currentSize; ++i) {
        // Print the "+" sign if the coefficient is positive
        //if (poly.polyArray[i] > 0) {
        if (poly.polyArray[i] > 0) {
            out << "+";
        }
        // Print the coefficient if it is not 0, skipping it and all following code otherwise
        if (poly.polyArray[i] != 0) {
            out << poly.polyArray[i];
        }
        else {
            continue;
        }
        // Print "x" if the exponent is greater than 0
        if (i > 0) {
            out << "x";
        }
        // Print exponent if it is greater than 1
        if (i > 1) {
            out << "^" << i;
        }
        // Print a space if this is not the last term in the polynomial
        if (i != currentSize - 1) {
            out << " ";
        }
    }
    return out;
}

Наконец, главное.

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

using namespace std;

int main() {
    Poly y(5, 7);
    cout << y;
    return 0;
}

1 Ответ

0 голосов
/ 11 января 2019

Директива об использовании пространства имен (например, using namespace std) применяется только к файлам кода и заголовков, написанным после директивы.

В вашем заголовочном файле Poly.h нет определения для ostream, потому что ostream находится в пространстве имен std. Есть три возможных исправления:

  • using namespace std в заголовочном файле (плохая практика)
  • using std::ostream в заголовочном файле
  • Используйте полное имя std::ostream

    friend std::ostream& operator<<(std::ostream& out, const Poly& poly);

Если мы применим второе исправление, то так будут выглядеть наши файлы.

Poly.h

#include <iostream>

using std::ostream; 

class Poly
{
public:
    Poly(int coeff, int expon);
    friend ostream& operator<<(ostream& out, const Poly& poly);
private:
    int *polyArray;
    int size;
};

Poly.cc

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

Poly::Poly(int coeff, int expon) {
    size = expon + 1;
    polyArray = new int[size];
    for (int i = 0; i < size; ++i) {
        polyArray[i] = (i == expon ? coeff : 0);
    }
}

ostream& operator<<(ostream& out, const Poly& poly) {
    int currentSize = poly.getSize();
    // If Poly is "empty", print 0
    if (currentSize == 1 && poly.polyArray[0] == 0) {
        out << 0;
        return out;
    }
    for (int i = 0; i < currentSize; ++i) {
        // Print the "+" sign if the coefficient is positive
        //if (poly.polyArray[i] > 0) {
        if (poly.polyArray[i] > 0) {
            out << "+";
        }
        // Print the coefficient if it is not 0, skipping it and all following code otherwise
        if (poly.polyArray[i] != 0) {
            out << poly.polyArray[i];
        }
        else {
            continue;
        }
        // Print "x" if the exponent is greater than 0
        if (i > 0) {
            out << "x";
        }
        // Print exponent if it is greater than 1
        if (i > 1) {
            out << "^" << i;
        }
        // Print a space if this is not the last term in the polynomial
        if (i != currentSize - 1) {
            out << " ";
        }
    }
    return out;
}

main.cc

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

using namespace std; 

int main() {
    Poly y(5, 7);
    cout << y;
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...