1st column
上面是原始代码。有人告诉我不要更改上面的代码。现在我有
mr
现在我有set.seed(1234)
j = 1
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.792934 6.277429 7.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.3456977 2.4291247 4.5060559
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548
set.seed(1234)
j = 2
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.792934 2.277429 3.084441
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 3.654302 6.429125 8.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 7.425260 7.453368 7.435548
set.seed(1234)
j = 3
i = 1
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] -0.2070657 6.2774292 7.0844412
i = 2
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 1.654302 4.429125 9.506056
i = 3
c(rnorm(i, ml[i, j], 1), rnorm((n - i), mr[i,j], 1))
[1] 2.425260 2.453368 2.435548
。但是r
没有成员class Element { };
class Container {
vector<Element*> elements;
};
。有什么简单的方法可以将class IndexElement: public Element {
int b_index;
};
class Container* ctr;
的属性从ctr->elements
重定向到Element
?预先感谢!
答案 0 :(得分:0)
您有一个选择:知道您在向量中拥有IndexElement
而不是Element
,然后可以使用static_cast<IndexElement*>(elements[i]);
。请注意,如果您没有IndexElement
,那么这将彻底中断。
如果可以修改b,则可以通过将b设置为虚拟来选择另一种选择。如果您不知道,则可能有Element
和IndexElement
,在这种情况下,请使用dynamic_cast<IndexElement*>(elements[i]);
并测试其结果是否为nullptr
。在这种情况下,b 必须是虚拟的(因此是虚拟析构函数)。
(我假设我们在Container
中,所以直接访问其成员)
使用修改后的Elements进行的全面试用(由于未分配elements
,因此将失败:
#include <vector>
using namespace std;
class Element{
public:
virtual ~Element() {}
};
class Container{
public:
vector<Elements*>elements;
};
class IndexElement: public Element{
int index;
};
int main()
{
Container aa;
static_cast<IndexElement*>(aa.elements[0]);
dynamic_cast<IndexElement*>(aa.elements[0]);
return 0;
}
答案 1 :(得分:0)
好吧,即使没有虚拟和RTTI(动态投放),您仍然可以选择跟踪并检查创建的suffix
实例,例如:
IndexElement
因此,您基本上可以保留所有已创建实例的地址集,并且在检查特定实例时,只需检查当前对象地址是否在该地址集中。
std::unordered_set<Element *> idxElemSet;
class IndexElement: public Element {
int b_index;
public:
IndexElement(int index) : b_index(index)
{ idxElemSet.insert(this); }
IndexElement(const IndexElement& other) : b_index(other.b_index)
{ idxElemSet.insert(this); }
// might also need the move constructor in case of c++11
~IndexElement()
{ idxElemSet.erase(this); }
};
int main()
{
Container c;
...
Element* e = c.elements[0];
if (idxElemSet.find(e) != idxElemSet.end()) {
IndexElement* ie = static_cast<IndexElement*>(e);
// do something with ie->b_index
}
return 0;
}
在idxElemSet
内部也可以是静态的,并且类本身可能仅提供静态转换功能,该功能在内部进行检查和转换,等等。