запись и доступ к данным

 
0
 
C++
ava
kuvshinka | 26.12.2016, 21:18
Есть класс A

class A
{
private:
int iValue;

public (или private?):
void setValue(int v) {iValue=v;}
int getValue() {return iValue;}
}
extern A objA;


также есть некие классы B, C...
Вопрос: можно ли (если да, то подскажите пож-та на примере) сделать так, чтобы в классе В можно было бы пользоваться (компиляция без ошибок) методами и setValue, и getValue класса А, а в классе С — ТОЛЬКО методом getValue? то есть класс А - это некий контейнер данных, которые сохраняются в нем через функции аля setValue в одних классах (например класс В), а используются (и ТОЛЬКО) через метод аля getValue - в других (класс С)
Ответы (12)
ava
solowey | 27.12.2016, 13:53 (Отредактирован 27.12.2016 14:00) #
В таком варианте подойдет???

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(10) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
};

class B : public A
{
public:
    B() {}
    ~B() {}
    void setValue(int v) { iValue = v; }
};

class C : public A
{
public:
    C() : A(2) {}
    ~C() {}
};

void main()
{
    A a = A();

    B b = B();
    b.setValue(5);

    C c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}
ava
миг | 27.12.2016, 14:51 #
SetValue наверно нужно в protected поместить. И наследовать class C : private A
ava
kuvshinka | 27.12.2016, 22:15 #
а у getValue какой должен быть уровень доступа в базовом классе А?
ava
миг | 27.12.2016, 22:20 #
kuvshinka, publlic конечно. ты ведь хотела, чтобы getvalue использовался во всех классах.
ava
kuvshinka | 27.12.2016, 23:07 #
миг: не работает...
при наследовании

class C : private A
или
class C : public A

при использовании в классе С

objA.setValue(10);

вылетает ошибка void A::setValue(int) is protected
ava
миг | 28.12.2016, 08:23 #
kuvshinka, потому-что закрытый метод класса. Там всё работает. Можешь создать открытую функцию, которая будет вызывать закрытый метод класса.
ava
kuvshinka | 28.12.2016, 22:32 #
А какой смысл "создать открытую функцию, которая будет вызывать закрытый метод класса"?
допустим:

class A
{
private:
int iValue;

public:
int getValue() {return iValue;}
void setNewValue(int t) {setValue(t);}

protected:
void setValue(int v) {iValue=v;}

}
extern A objA;

получается ведь масло масляное...тогда я эту функцию setNewValue смогу и из любого другого класса © вызвать(и даже без наследования class C : private A)...
objA.setNewValue(10);
мне же надо иметь возможность из одного класса вызывать setNewValue (или setValue), а из другого класса - не иметь такой возможности (ошибка при сборке)...
ava
миг | 29.12.2016, 15:17 #
kuvshinka, Вы имеете эту возможность. Из другого-класса думаю не получится вызвать эту функцию. 
ava
kuvshinka | 29.12.2016, 22:00 #
в том-то все и дело, что можно вызвать setNewValue из любого другого класса - она же public....проверено! 
ava
feodorv | 30.12.2016, 09:50 #
Может, Вы это (тут ссылка) ищите?
ava
volatile | 30.12.2016, 14:24 #
Если судить по первому посту
Цитата (kuvshinka @  26.12.2016,  21:18 findReferencedText)
Вопрос: можно ли (если да, то подскажите пож-та на примере) сделать так, чтобы в классе В можно было бы пользоваться (компиляция без ошибок) методами и setValue, и getValue класса А, а в классе С — ТОЛЬКО методом getValue?

то человеку элементарно нужна константность объекта:

func B (A & a)
{
   // здесь можете ползоваться и setValue и getValue
}

func С (const A & a)
{
   // здесь можете ползоваться только getValue
}

это отдельные функции, для упрощения.
если нужен весь класс, то включить ссылку (константную или нет в зависимости от нужд) в члены класа, и  инициализировать в конструкторе.

ну и сам класс А подправить чуток

class A
{
...
int getValue() const {return iValue;}
...

Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить