Как стать автором
Обновить
0
0
Alexey Kudinkin @f0rbidik

Пользователь

Отправить сообщение
Каким образом, в таком случае, вы получаете little-endian из big-endian?
Внимательно перечитайте первый комментарий вышележащей ветки.
Неверно: виртуальное наследование предотвращает репликацию субобъекта виртуального базового класса для объектов наследующих классов, являющихся, в свою очередь, субобъектами базовых классов для объекта их общего класса-наследника.
Комментарий относится, к вышележащей ветке.
Вас не смущает, что приведённая вами реализация работает неверно?
Это означает, что BE и LE-платформами данные будут интерпретироваться по-разному:

unsigned char raw[4] = {}; raw[3] = 1;

// Big-endian platform (ex. MAC OS X on PPC) output: 1
// Little-endian platform (ex. MAC OS X on PPC) output: 16777216
std::cout << *((__int32 *) &raw) << "\n";
Представление данных в памяти не зависит от манеры интерпретации их средой исполнения: конструкторы для классов BigEndian и LittleEndian должны реализовывать семантику побайтового копирования:

LittleEndian::LittleEndian(const T * p) {
  const unsigned char * pc = (const unsigned char*) p;
  for (unsigned i = 0; i < sizeof(T); i++)
    bytes[i] = *pc++;
};

BigEndian::BigEndian(const T * p) {
  const unsigned char * pc = (const unsigned char*) p;
  for (unsigned i = 0; i < sizeof(T); i++)
    bytes[i] = *pc++;
};


А операторы приведения иметь, соответственно вид:

LittleEndian::operator const T() const {
      return raw_value;
}

BigEndian::operator const T() const {
      return raw_value;
}
Во-первых, ваш код платформозависим: он работает не на уровне представления данных в памяти а на уровне интерпретации данного представления средой исполнения. Соответственно, на BE платформах он работать не будет.

Во-вторых, ваш код не позволяет пребразовать BE в LE (или наоборот):

#include <iostream>
int main() {
  
  unsigned char be_unit[4] = {}; be_unit[3] = 1;

  BigEndian<int> be(*((int *) &be_unit));
  LittleEndian<int> le(be);

  std::cout << (int) be << "\n";  // 16777216
  std::cout << (int) le << "\n";   // 16777216

};


Во-третьих, endianness определяет порядок индивидуально адресуемых единиц в машинном слове: ваш код для целых занимающих более одного слова будет работать неверно.
При этом функция возвращает массив из элементов 'char' длиной N.

Функция возвращает ссылку на массив.
Неверно толкуете стандарт. Этот пункт говорит о том, что поведение не определено в следующем случае:

struct A {};

void foo() { static A a; };

struct B {
  ~B() { foo(); };
};

void main() {

  static B b;
  foo();

};
Подписаны C/C++ incompatibilities. Этот код компилируется С99 компилятором, но содержит 2-е ошибки. Чем не вопрос на собеседовании?
Вы не видите разницы между method overloading и method overriding?

Не изображайте из себя жертву: если на то пошло, то я высказываю не собственное «мнение», а «мнение» Christopher Strachey, John Reynolds, и иже с ними. Признавать или не признавать их идеи — ваше право. Однако используя общепринятую терминологию в собственных целях вы вводите людей в заблуждение и только.
In computer science, polymorphism is a programming language feature that allows values of different data types to be handled using a uniform interface.



  1. Ad-hoc polymorphism: If the function denotes different and potentially heterogeneous implementations depending on a limited range of individually specified types and its combination, it is called ad-hoc polymorphism. Ad-hoc polymorphism is supported in many languages using function and method overloading.

  2. Parametric polymorphism: If all code is written without mention of any specific type and thus can be used transparently with any number of new types, it is called parametric polymorphism.

    In the object-oriented programming community, programming using parametric polymorphism is often called generic programming.

  3. Subtype polymorphism: In object-oriented programming, subtype polymorphism or inclusion polymorphism is a concept in type theory wherein a name may denote instances of many different classes as long as they are related by some common super class.


http://en.wikipedia.org/wiki/Polymorphism_(computer_science)
Статический полиморфизм или compile-time polymorphism это то, что предлагают шаблоны функций/классов (class/function templates).
В вашем примере пункта #14 полиморфизма нет. Есть method overriding.
// main.c

main()  /* poor style C. Not C++ */
{
double sq2 = sqrt(2);                         /* call undeclared function */
printf("the square root of 2 is %g\n", sq2);  /* call undeclared function */
}
6. Как защитить объект от копирования?

Ответ: Сделать private конструктор копирования и оператор =.

Так вы защититесь только от копирования извне, но сможете копировать в членах класса. Нужно не просто делать их приватными, но ещё и оставлять без реализации.


В членах и friend'ах.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность