VladD2:
> ПК> Интересно... А в чем, по-твоему, большее совершенство, скажем, C++ по сравнению c С с точки зрения инкапсуляции?
> Она в нем есть.
Средства для обеспечения инкапсуляции есть и в C. При этом получающаяся инкапсуляция ничуть не "меньше", чем в C++.
> ПК> Можно примерчик?
> С++:
> > struct A
> {
> private:
> int _val;
>
> public:
> int getVal() { return _val; }
>
> void setVal(int val)
> {
> if (val < 0)
> throw "требования инкапсуляции не допускают установку "
> "отрицальтного значения свойству Val.";
> _val = val;
> }
> };
>
> void main()
> {
> A a;
> a.setVal(123); // OK
> a.setVal(-123); // Облом в рантайме.
> a._val = -123; // Облом во время компиляции.
> }
Ты привел неэквивалентный с точки зрения инкапсуляции пример на C. Но это не означает, что нельзя написать эквивалентный в этом отношении пример на C. Вот он:
Заголовочный файл:
typedef int ErrorCode;
#define A_OK ((ErrorCode)0)
// Требования инкапсуляции не допускают установку
// отрицальтного значения свойству Val.
//
#define A_ERROR_INVALID_VAL ((ErrorCode)-1)
typedef struct Atag A;
A* create_A(void);
void delete_A(A*);
int A_getVal(A*);
ErrorCode A_setVal(A*, int);
Файл с реализацией:
. . .
struct Atag
{
int _val;
};
A* create_A(void)
{
A* a = (A*)malloc(sizeof(A));
return a;
}
void delete_A(A* a)
{
free(a);
}
int A_getVal(A* a)
{
return a->_val;
}
ErrorCode setVal(A* a, int val)
{
if (val < 0)
return A_ERROR_INVALID_VAL;
a->_val = val;
return A_OK;
}
Использование:
int main()
{
A* a;
ErrorCode err_code;
a = create_A();
if (!a)
return -1;
err_code = 0;
. . .
if (err_code != A_OK)
err_code = A_setVal(a, 123); // OK
if (err_code != A_OK)
err_code = A_setVal(a, -123); // Облом в рантайме.
if (err_code != A_OK)
a->_val = -123; // Облом во время компиляции.
delete_A(a);
return err_code == A_OK ? 0 : -1;
}
> Не думаю, что этот пример был действительно нужен.
Отчего же, он вполне хорошо проиллюстрировал твою позицию, здорово сэкономив нам время на ненужной риторике. Как видишь, C вполне позволяет писать код, эквивалентный в отношении инкапсуляции коду на C++. Скажем, та же Win API в этом отношении вполне в порядке.
Posted via RSDN NNTP Server 1.9 gamma
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен