Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> запись и доступ к данным 
:(
    Опции темы
kuvshinka
Дата 26.12.2016, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



Есть класс 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 - в других (класс С)
PM MAIL   Вверх
миг
Дата 27.12.2016, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



https://msdn.microsoft.com/ru-ru/library/kktasw36.aspx
Используйте public и protected

Это сообщение отредактировал(а) миг - 27.12.2016, 13:04
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
solowey
Дата 27.12.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



В таком варианте подойдет???
Код

#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://vingrad.com
PM MAIL   Вверх
solowey
Дата 27.12.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



В таком варианте подойдет???
Код

#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://vingrad.com
PM MAIL   Вверх
solowey
Дата 27.12.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



В таком варианте подойдет???
Код

#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://vingrad.com
PM MAIL   Вверх
solowey
Дата 27.12.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



В таком варианте подойдет???
Код

#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://vingrad.com
PM MAIL   Вверх
solowey
Дата 27.12.2016, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 0
Регистрация: 24.11.2009

Репутация: нет
Всего: нет



В таком варианте подойдет???
Код

#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://vingrad.com
PM MAIL   Вверх
миг
Дата 27.12.2016, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



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

Это сообщение отредактировал(а) миг - 27.12.2016, 22:18
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
kuvshinka
Дата 27.12.2016, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



а у getValue какой должен быть уровень доступа в базовом классе А?
PM MAIL   Вверх
миг
Дата 27.12.2016, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



kuvshinka, publlic конечно. ты ведь хотела, чтобы getvalue использовался во всех классах.
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
kuvshinka
Дата 27.12.2016, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



миг: не работает...
при наследовании
Код

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

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

objA.setValue(10);

вылетает ошибка void A::setValue(int) is protected
PM MAIL   Вверх
миг
Дата 28.12.2016, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



kuvshinka, потому-что закрытый метод класса. Там всё работает. Можешь создать открытую функцию, которая будет вызывать закрытый метод класса.
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
kuvshinka
Дата 28.12.2016, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



А какой смысл "создать открытую функцию, которая будет вызывать закрытый метод класса"?
допустим:
Код

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), а из другого класса - не иметь такой возможности (ошибка при сборке)...
PM MAIL   Вверх
миг
Дата 29.12.2016, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 15.9.2008

Репутация: нет
Всего: 1



kuvshinka, Вы имеете эту возможность. Из другого-класса думаю не получится вызвать эту функцию. 
--------------------
Oaks may fall when reeds stand the storm.
PM MAIL   Вверх
kuvshinka
Дата 29.12.2016, 22:00 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 27.4.2008

Репутация: нет
Всего: нет



в том-то все и дело, что можно вызвать setNewValue из любого другого класса - она же public....проверено! 
PM MAIL   Вверх
feodorv
Дата 30.12.2016, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Может, Вы это (тут ссылка) ищите?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 30.12.2016, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Если судить по первому посту
Цитата(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;}
...


PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1009 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.