标签: rtti

RTTI:如何获取字段的对象指针?

我有一个TRttiProperty名为的变量aRttiProperty,它指向下面的属性:

Tsubscription = class(TMyObject)
private
  fBilling: TMyObject;
public
  property billing: TMyObject read fBilling; // << aRttiProperty point to this member
end;
Run Code Online (Sandbox Code Playgroud)

现在,我如何从中提取fBilling对象指针aRttiProperty

我尝试这样做,但无法正常工作:

function Tsubscription.getfBillingObj(const aRttiProperty: TRttiProperty): TMyObject 
begin
  Result := aRttiProperty.GetValue(Self).AsType<TMyObject>;
end; 
Run Code Online (Sandbox Code Playgroud)

它返回父TSubscription对象而不是fbilling字段对象。

delphi rtti

0
推荐指数
1
解决办法
803
查看次数

是否使用RTTI(或返回类型标记的虚函数)?

使用RTTI(通过使用typeiddynamic_cast)几乎被普遍认为是糟糕的编程实践.

类似地,定义一个所有派生必须通过虚函数返回的类型标记也被认为是不好的做法,例如:

enum Type {
    DERIVED_1,
    DERIVED_2
};

class Base {
    virtual Type type() = 0;
};

class Derived1 : public Base {
    Type type() override {
        return DERIVED_1;
    }
};

class Derived2 : public Base {
    Type type() override {
        return DERIVED_2;
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,有时我需要区分不同的派生类,比如当我有一个指针时Base可能是Derived1或者Derived2:

Base *b = new Derived2();

// Approach 1:
if (typeid(*b) == typeid(Derived1)) {
    std::cout << "I have a Derived1.\n";
} else if (typeid(*b) == …
Run Code Online (Sandbox Code Playgroud)

c++ rtti

0
推荐指数
1
解决办法
59
查看次数

Delphi从TForm对象制作组件

我动态地在表单对象上添加了组件

Edit1 := TEdit.Create(form3);
Run Code Online (Sandbox Code Playgroud)

我有Tform类的对象form3.现在我想要做的是我想创建一个form3的组件模板,这样我就可以将该组件模板拖放到我的任何其他组件上,并且它中的所有组件将自动供我使用.任何人都可以帮助我如何做组件模板?

delphi rtti delphi-7

-2
推荐指数
1
解决办法
273
查看次数

C ++为什么不按运行时类型销毁对象?

据我所知,当基类具有虚函数时,C ++可以获取对象动态类型的准确信息。

class Base
{
public:
    Base() {}
    ~Base() { std::cout << "Base Destructed" << std::endl; }

    virtual void f() {}
};

class Derived : public Base
{
public:
    Derived() {}
    ~Derived() { std::cout << "Derived Destructed" << std::endl; }
};

void PrintTypeName(Base *p)
{
    std::cout << typeid(*p).name() << std::endl;
}

int main()
{
    Base *p = new Derived();
    PrintTypeName(p);
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以打印正确的对象类型,但是为什么它不能调用正确的析构函数。

我在g ++和Windows编译器上对其进行了测试,它们给出了相同的结果。我知道如果我使Base析构函数virtual,它可以正确地分解。

但是我想知道为什么不通过调用析构函数typeid

c++ rtti

-2
推荐指数
1
解决办法
89
查看次数

如何检测TWinControl是否具有FONT属性?

我需要更改通过Controls容器控件的属性收集的控件的 FONT 属性:

for i := 0 to ContainerControl.ControlCount - 1 do
begin  
  ContainerControl.Controls[i].Font.Size := 8;  // error  
end;
Run Code Online (Sandbox Code Playgroud)

为此,我需要类型转换ContainerControl.Controls[i]为具有 FONT 属性的 TWinControl 类。有这样的班级吗?或者我如何检测特定的 TWinControl 是否具有 FONT 属性?或者如何将特定 TWincontrol 类型转换为特定其他 TWinControl 的类型?

delphi rtti delphi-10.3-rio

-4
推荐指数
1
解决办法
682
查看次数

标签 统计

rtti ×5

delphi ×3

c++ ×2

delphi-10.3-rio ×1

delphi-7 ×1