Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java C++中的“对象”数据类型?_Java_C#_C++ - Fatal编程技术网

Java C++中的“对象”数据类型?

Java C++中的“对象”数据类型?,java,c#,c++,Java,C#,C++,我发现了一些与我有关的问题,但它们并没有真正回答我的问题。在Java和C中,我们有一个对象数据类型,或者在C中有一个变量,它可以像任何东西一样存储。例如,我想使用一个二维数组,其类型设置为object,这样我就可以在其中存储整数和字符串。但是我真的很想念C++。据我所知,C++中有模板,但我不知道它们是如何工作的。 template <class T> T t[] = {1, "2"}; 这是一个错误。我知道列表,但如果可能的话,我想使用数组。在C语言中,可以由引用标识的每个对象都

我发现了一些与我有关的问题,但它们并没有真正回答我的问题。在Java和C中,我们有一个对象数据类型,或者在C中有一个变量,它可以像任何东西一样存储。例如,我想使用一个二维数组,其类型设置为object,这样我就可以在其中存储整数和字符串。但是我真的很想念C++。据我所知,C++中有模板,但我不知道它们是如何工作的。
template <class T>
T t[] = {1, "2"};

这是一个错误。我知道列表,但如果可能的话,我想使用数组。

在C语言中,可以由引用标识的每个对象都以相同类型的头开始,其中包括有关其类型的信息,是否与监视器锁关联,这使得有方法可以接收任何类型的引用,并对由此标识的对象执行某些操作,而不必知道或关心引用的类型

<>在C++中,可以有没有任何头的类型,只是原始数据。一些这样的类型被称为PODS—普通的旧数据结构,可以支持一些其他类型无法安全完成的操作。然而,对于共享一个共同样式的标题的对象,并没有通用的概念。尽管许多非POD类型确实支持至少一个需要某种类型的头的公共特性,即检查基类指针是否可以安全地强制转换到派生类对象的能力,但不能保证头包含足以唯一标识对象类的信息。如果X1和X2都从X0派生,同样Z1和Z2也从Z0派生,那么一个实现可以简单地在报头中为X0和Z0存储0,为X1和Z1存储1,为X2和Z2存储2。由于X0*不可能识别Z1,而Z0*也不可能识别X1,因此不需要让标头区分X1和Z1


因为没有标准的头可以唯一地标识对象的类型,所以没有一种通用的方法来接收一个指向任意未知类型的对象的指针,并用它做任何有用的东西。

< P>这里是一个简短的C++代码,它可以完成你所要的。我想。 有时候,仅仅看一个例子是有帮助的。我想cppreference.com是你在这里的朋友。有许多很好的例子来说明用法

#include <iostream>
#include <variant>
#include <array>

int main()
{
//  Note this will also work:
//  std::variant<int, std::string> t[] = { 1, "2" };

    using node = std::variant<int, std::string>; 
    std::array<node, 2> t = { 1, "2" };

    std::cout << "t[0]: " << std::get<int>(t[0]) << std::endl;
    std::cout << "t[1]: " << std::get<std::string>(t[1]) << std::endl;

    return 0;
}

你关于var的陈述是完全错误的。C中的var是语法糖,它让编译器确定类型。它不是objectSee std::any/std::variant或它们的boost对应项出于好奇,为什么需要它?在Java中,任何类Foo都隐式继承自Object。C++中没有任何类型的基础。但是,我真的很怀念C++中的这一点,如果你需要把对象比作非常非常偶然的类对象,那么你可能做得不对。即使在java中,更有趣的是,尝试在C++中不用指针来执行这一过程是单向的。系统只支持多态类型,而仅在RTTI启用时才支持从基类型到派生类型的强制转换。我不认为这是非POD类型共享的一个常见特性。@FrançoisAndrieux:我认为,如果指针标识任何从基类型派生的对象,那么核心语言保证从基类型指针强制转换到特定派生类型指针是安全的。无论人们是否认为这是一个共同的特征,我的目的是强调缺乏真正和有用的共同特征,通过识别最接近这样一个特征的东西,并观察到即使这不是一个很大的特征。@supercat这不适用于非。在类层次结构中需要一个虚拟成员函数。因此,C++中的许多类类型与DyrimeSkyCube的使用不兼容。它在几个情况下仍然可以成功,例如,派生基转换,但是这些转换可以静态地确定,不需要运行时信息。@弗兰席奥斯安德利:我的主要观点是存在一种类型,其中C++必须包括某种损坏的报头,但它并不包括所有此类类型上的头,甚至在需要头的类型中,它也可能只能由知道所需基类的代码使用。这些特性一起排除了通用方法的可能性,这些方法可以在类型不可知函数中使用所有类型的对象。