标签: static-cast

Union vs. static_cast(void*)

我正在编写代码,直到现在我正在使用这样的结构:

struct s{
  enum Types { zero = 0, one, two };
  unsigned int type;
  void* data;
} 
Run Code Online (Sandbox Code Playgroud)

我需要一些通用的结构来存储来自不同类的数据,我想在std :: vector中使用它,这就是为什么我不能使用模板的原因.什么是更好的选择:工会或无效指针?

Void指针只分配我需要的空间,但是由于某些原因,c ++是强类型语言,并且我需要使用这些数据的地方不是c ++代码应该设计的方式.正如我所读到的,除非别无选择,否则不应使用void指针.

这个替代方案可能是工会.它们带有c ++,并为每个成员使用相同的内存空间,非常类似于void指针.然而,它们的价格是合理的 - 分配的空间是联合中最大元素的大小,在我看来,大小之间的差异很大.

这是相当风格和"正确的语言使用"问题,因为这两种方式完成了我需要做的事情,但我不能确定好的程式化的c ++代码是否可以为浪费的内存付出代价(尽管这些日子的内存不是很大)关心).

c++ void-pointers static-cast unions

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

C++多重继承+虚函数( - 模糊)=奇怪的行为(也是函数指针)

我正在创建一些旨在提供对回调功能的访问的接口.也就是说,继承自接口A允许类使用类型1的回调; 接口B允许类型2.继承A和B允许两种类型的回调.最终目的是A类和B类通过继承它们来处理所有脏工作.

第一个问题

这是一个小例子,应该说明我遇到的一些麻烦:

class A
{
public:
    static void AFoo( void* inst )
    {
        ((A*)inst)->ABar( );
    }
    virtual void ABar( void ) = 0;
};

class B
{
public:
    static void BFoo( void* inst )
    {
        ((B*)inst)->BBar( );
    }
    virtual void BBar( void ) = 0;
};

class C : public A, public B
{
public:
    void ABar( void ){ cout << "A"; };
    void BBar( void ){ cout << "B"; };
};
Run Code Online (Sandbox Code Playgroud)

通过拨打电话

C* c_inst …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance pointers casting static-cast

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

static_cast和RTTI vs dynamic_cast

请遵守以下代码.据我所知,dynamic_cast比static_cast慢.因为它在运行时评估类型.我在这里的疑问是,如果我们将static_cast与typeid()一起使用如下,它是否需要与动态强制转换相同的时间?它会比dynamic_cast快吗?

class Shape
{ 
public:
  virtual ~Shape(){}
};
class Circle : public Shape{ };
class Square : public Shape{ };
Run Code Online (Sandbox Code Playgroud)

使用RTTI进行静态转换:

Circle c;
Shape* s = &c; // Upcast: normal and OK

// More explicit but unnecessary:
s = static_cast<Shape*>(&c);
// (Since upcasting is such a safe and common
// operation, the cast becomes cluttering)

Circle* cp = 0;
Square* sp = 0;

// Static Navigation of class hierarchies
// requires extra type information:
if(typeid(s) == typeid(cp)) // C++ RTTI …
Run Code Online (Sandbox Code Playgroud)

c++ dynamic-cast static-cast

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

如何使用静态强制转换来管理共享对象的生命周期?

我是C++样式演员的新手,需要帮助理解下面的代码是如何工作的(这是我写的一些虚拟代码来理解事物).

#include <iostream>
#include <memory>

class A { 
public:
    A() : a(1) {
        std::cout << "Creating A\n";
    }   
    ~A() {
        std::cout << "Destroying A\n";
    }   
    int a;
};

class B : public A { 
public:
    B() : b(2) {
        std::cout << "Creating B\n";
    }   
    ~B() {
        std::cout << "Destroying B\n";
    }   
    int b;
};

int main() {
    std::shared_ptr<B> objectB(new B());
    {   
    std::shared_ptr<A> (static_cast<A*>(objectB.get()));
    std::cout << "End of inner scope\n";
    }   
    std::cout << "End of outer scope\n";
}
Run Code Online (Sandbox Code Playgroud)

它打印

Creating A …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr static-cast c++11

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

使用static_cast进行向下转换 - 指针和对象

说我有以下类类型

class base
{

};

class der : public base
{
};
Run Code Online (Sandbox Code Playgroud)

使用static_Cast,您可以使用对象和指针.

我试过以下 - 哪个有效(指针)

base* b = new base();
der * m = static_cast<der*>(b);
Run Code Online (Sandbox Code Playgroud)

但是以下不起作用

base b;
der m = static_cast<der>(b);
Run Code Online (Sandbox Code Playgroud)

有什么建议为什么第二个不起作用?静态转换不处理指针和对象吗?它适用于指针,但它不能与对象一起使用?

c++ pointers casting object static-cast

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

整数到枚举转换的static_cast

有一些函数将枚举作为参数

void myfunc(myEnum input);
Run Code Online (Sandbox Code Playgroud)

据我了解,如果必须为此函数提供一个整数,建议将其显式转换为枚举,原因是所有整数可能都不是有效的枚举值。

根据MSDN

“ static_cast运算符可以将整数值显式转换为枚举类型。如果整数类型的值不在枚举值的范围内,则所得的枚举值不确定。”

并按照C ++标准5.2.9静态转换-> 10

“整数或枚举类型的值可以显式转换为枚举类型。如果原始值在枚举值(7.2)的范围内,则该值不变。否则,结果值未指定(并且可能不在该范围)。”

那么static_cast在这种情况下使用的意义是什么?是否有一些选项会引发超出枚举范围的值的异常(除了为此编写显式代码)?

c++ enums casting static-cast

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

如何在c ++中实现static_cast?

static_cast工作怎么样?如果你做的事......

如果D通过某些未指定的层次结构(不一定是直接)从B继承,并且您执行以下操作:

B* b = new D();
D* d = static_cast<D*>(b);
Run Code Online (Sandbox Code Playgroud)

怎么了?它只是在编译时计算偏移量并将该偏移量应用于指针吗?或者是否有一些事情在运行时发生以进行演员表?

c++ casting static-cast

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

字符串转换为整数的一部分 - C++

我想知道我是否可以使用static_cast?将部分字符串转换为整数?我知道atoi()存在类似的东西,但我应该真的使用它才能将我的字符串的第一个字符转换为整数吗?

int w;
string my_str;
getline(cin, my_str);
w = static_cast<int>(my_str[0]) - 48;
Run Code Online (Sandbox Code Playgroud)

这是正确的吗?或者我应该以另一种方式做到这一点?

c++ string integer static-cast

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

为什么const_cast和static_cast对const引用没有影响?

在以下代码中:

    #include<iostream>
    using namespace std;
    int main()
    {
        const int i = 8;
        int j = 90;
        const_cast<int &>(i)  = 10;
        static_cast<const int&> (j);
        j = 200;
        cout << " i = " << i << endl;
        cout << " j = " << j << endl;
   }
Run Code Online (Sandbox Code Playgroud)

我以为输出会是

i = 10
j = 90
Run Code Online (Sandbox Code Playgroud)

但实际产量是

i = 8
j = 200 
Run Code Online (Sandbox Code Playgroud)

所以铸造不起作用?

c++ const-cast static-cast

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

使用static_cast将'int'转换为'const int',但既不初始化也不具有const行为

我正在关注一个教程,它说我可以使用静态强制转换将非const变量设为const。我尝试这样做,但编译器每次都会给我一个错误。

#include <iostream>
using namespace std;

int main()
{
int j = 0;
static_cast<const int&>(j) = 5 ;

cout << j;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器给我以下错误消息。

hello.cpp: In function 'int main()':
hello.cpp:11:28: error: assignment of read-only location 'j'
 static_cast<const int&>(j) = 5 ;
Run Code Online (Sandbox Code Playgroud)

然后,我尝试查看“ j”是否变为常数。但是我可以为此赋值,编译器在那里没有显示任何问题。由于前一行中的问题,可能是编译器未编译该行。

#include <iostream>
using namespace std;

int main()
{
int j = 0;
static_cast<const int&>(j) = 5 ;
j = 8;

cout << j;
return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经搜索了很多解决方案,但没有找到任何解决方案。

c++ const static-cast

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