Конструктор класса C++ может знать его имя экземпляра?

Я думаю, что Вы - безопасное создание сменной системы на основе:

  • Упаковка сменной функциональности в библиотеку (.dll, .so, и т.д.)
  • Требование, чтобы плагин представил ключевой экспорт языка C.
  • Требование, что сменная реализация (и возврат указатель/ссылка на) абстрактный интерфейс C++.

, Вероятно, самая успешная система плагина C++: старый добрый Adobe Photoshop . И если не, что, один из виртуальных форматов синтезатора, таких как VSTi и т.д.

15
задан Alex B 25 November 2009 в 10:12
поделиться

6 ответов

Не с самим языком, но вы можете написать что-то вроде:

#include <iostream>
#include <string>

class Foo
{
 public:
    Foo(const std::string& name) { m_name = name;}
    void Print() { std::cout << "Instance name = " << m_name << std::endl; }

  private:
    std::string m_name;
};

int main() 
{
    Foo a("a");
    Foo b("b");

    a.Print();
    b.Print();

    return 0;
}
25
ответ дан 30 November 2019 в 23:47
поделиться

Это невозможно. В C ++ нет концепции «отражения», как в платформе .NET. Но в библиотеке MFC есть класс CRunTime - вы можете посмотреть, например.

0
ответ дан 30 November 2019 в 23:47
поделиться

Имена переменных не выдерживают компиляции. Лучшее, что вы можете сделать, - это передать имя переменной в конструктор объекта и сохранить его внутри объекта с помощью макроса. Последнее приведет к действительно уродливому коду, поэтому вам понадобится это только в крайнем случае.

8
ответ дан 30 November 2019 в 23:47
поделиться

Что бы это значило?

void f(T const& p) {
    cout << p.name();
}

T r() {
    T c;
    return c;
}

void g() {
    T a;
    cout << a.name();
    T & b = a;
    cout << b.name();
    T * ptr = &b; 
    cout << ptr->name();

    T d = r();
    cout << d.name();
}

Чего вы ожидали? "а" каждый раз? А как насчет к / д?

9
ответ дан 30 November 2019 в 23:47
поделиться

Имена переменных не существуют в скомпилированном коде.

Однако вы можете использовать некоторые #define , чтобы получить имя в предварительной обработке, и пусть имена будут заполнены перед скомпилировать.

Примерно так:

#define SHOW(a) std::cout << #a << ": " << (a) << std::endl
// ...
int i = 2;
SHOW (i);
16
ответ дан 30 November 2019 в 23:47
поделиться

No. Variable names are for the programmer, the compiler sees addresses.

Other languages that provide meta-data/reflection about their program might provide this functionality, C++ isn't one of those languages.

27
ответ дан 30 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: