Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > запись и доступ к данным


Автор: 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 - в других (класс С)

Автор: миг 27.12.2016, 12:57
https://msdn.microsoft.com/ru-ru/library/kktasw36.aspx
Используйте public и protected

Автор: solowey 27.12.2016, 13:53
В таком варианте подойдет???
Код

#include "stdafx.h"

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(0) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
    void setValue(int v) { iValue = v; }
};

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

class C : public B
{
public:
    C() : B() {}
    ~C() {}
};

void main()
{
    A a = A();
    a.setValue(10);

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

    A c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-dostup-k-dannym-id58615f8e84a74b7a870f5bc3#findElement_E7045_5862481007af937b4d68d238_0

Автор: solowey 27.12.2016, 13:53
В таком варианте подойдет???
Код

#include "stdafx.h"

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(0) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
    void setValue(int v) { iValue = v; }
};

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

class C : public B
{
public:
    C() : B() {}
    ~C() {}
};

void main()
{
    A a = A();
    a.setValue(10);

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

    A c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-dostup-k-dannym-id58615f8e84a74b7a870f5bc3#findElement_E7045_5862481007af937b4d68d238_0

Автор: solowey 27.12.2016, 13:53
В таком варианте подойдет???
Код

#include "stdafx.h"

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(0) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
    void setValue(int v) { iValue = v; }
};

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

class C : public B
{
public:
    C() : B() {}
    ~C() {}
};

void main()
{
    A a = A();
    a.setValue(10);

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

    A c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-dostup-k-dannym-id58615f8e84a74b7a870f5bc3#findElement_E7045_5862481007af937b4d68d238_0

Автор: solowey 27.12.2016, 13:53
В таком варианте подойдет???
Код

#include "stdafx.h"

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(0) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
    void setValue(int v) { iValue = v; }
};

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

class C : public B
{
public:
    C() : B() {}
    ~C() {}
};

void main()
{
    A a = A();
    a.setValue(10);

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

    A c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-dostup-k-dannym-id58615f8e84a74b7a870f5bc3#findElement_E7045_5862481007af937b4d68d238_0

Автор: solowey 27.12.2016, 13:53
В таком варианте подойдет???
Код

#include "stdafx.h"

#include <iostream>

class A
{
protected:
    int iValue;

public:
    A(): iValue(0) {}
    explicit A(int value) { iValue = value; }
    ~A() {}
    int getValue() const { return iValue; }
    void setValue(int v) { iValue = v; }
};

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

class C : public B
{
public:
    C() : B() {}
    ~C() {}
};

void main()
{
    A a = A();
    a.setValue(10);

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

    A c = C();

    std::cout << "a=" << a.getValue() << "; b=" << b.getValue() << "; c=" << c.getValue();
}


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/zapis-i-dostup-k-dannym-id58615f8e84a74b7a870f5bc3#findElement_E7045_5862481007af937b4d68d238_0

Автор: миг 27.12.2016, 14:51
SetValue наверно нужно в protected поместить. И наследовать class C : private A

Автор: kuvshinka 27.12.2016, 22:15
а у getValue какой должен быть уровень доступа в базовом классе А?

Автор: миг 27.12.2016, 22:20
kuvshinka, publlic конечно. ты ведь хотела, чтобы getvalue использовался во всех классах.

Автор: kuvshinka 27.12.2016, 23:07
миг: не работает...
при наследовании
Код

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

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

objA.setValue(10);

вылетает ошибка void A::setValue(int) is protected

Автор: миг 28.12.2016, 08:23
kuvshinka, потому-что закрытый метод класса. Там всё работает. Можешь создать открытую функцию, которая будет вызывать закрытый метод класса.

Автор: 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), а из другого класса - не иметь такой возможности (ошибка при сборке)...

Автор: миг 29.12.2016, 15:17
kuvshinka, Вы имеете эту возможность. Из другого-класса думаю не получится вызвать эту функцию. 

Автор: kuvshinka 29.12.2016, 22:00
в том-то все и дело, что можно вызвать setNewValue из любого другого класса - она же public....проверено! 

Автор: feodorv 30.12.2016, 09:50
Может, Вы https://msdn.microsoft.com/ru-ru/library/465sdshe.aspx (тут ссылка) ищите?

Автор: volatile 30.12.2016, 14:24
Если судить по первому посту
Цитата(kuvshinka @  26.12.2016,  21:18 Найти цитируемый пост)
Вопрос: можно ли (если да, то подскажите пож-та на примере) сделать так, чтобы в классе В можно было бы пользоваться (компиляция без ошибок) методами и setValue, и getValue класса А, а в классе С — ТОЛЬКО методом getValue?

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

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

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

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

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

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)