我创建了一个集合,我想提供一个STL风格的随机访问迭代器.我正在寻找迭代器的示例实现,但我没有找到任何.我知道需要const重载[]和*运算符.迭代器有什么要求是"STL风格",还有哪些其他缺陷需要避免(如果有的话)?
附加上下文:这是一个库,除非我真的需要,否则我不想引入任何依赖.我编写自己的集合,以便能够使用相同的编译器在C++ 03和C++ 11之间提供二进制兼容性(因此没有STL可能会破坏).
假设我有三个C++类FooA,FooB和FooC.
FooA有一个名为的成员函数Hello,我想在类FooB中调用这个函数,但我不希望类FooC能够调用它.我能想出来实现这一点的最好方法是将FooB声明为FooA的朋友类.但只要我这样做,所有 FooA的私人和受保护成员都将被曝光,这对我来说是非常不可接受的.
所以,我想知道C++(03或11)中是否有任何机制比friend类可以解决这个难题更好.
我认为如果可以使用以下语法会很好:
class FooA
{
private friend class FooB:
void Hello();
void Hello2();
private:
void Hello3();
int m_iData;
};
class FooB
{
void fun()
{
FooA objA;
objA.Hello() // right
objA.Hello2() // right
objA.Hello3() // compile error
ojbA.m_iData = 0; // compile error
}
};
class FooC
{
void fun()
{
FooA objA;
objA.Hello() // compile error
objA.Hello2() // compile error
objA.Hello3() // compile error
ojbA.m_iData = 0; // compile error
} …Run Code Online (Sandbox Code Playgroud) 我正在使用Stroustrup(Programming Principles&Practice Using C++)一书学习C++.在练习中,我们定义了一个简单的结构:
template<typename T>
struct S {
explicit S(T v):val{v} { };
T& get();
const T& get() const;
void set(T v);
void read_val(T& v);
T& operator=(const T& t); // deep copy assignment
private:
T val;
};
Run Code Online (Sandbox Code Playgroud)
然后我们要求定义一个const和一个非const成员函数来获取val.
我想知道:有任何情况下get,返回非const 函数是否有意义val?
对我来说似乎更清洁,我们无法间接改变这种情况下的价值.在需要const和非const get函数返回成员变量的情况下可能会出现什么情况?
我正在学习C++,所以请耐心等待我.我有一个std::valarray在其中有double元素,我认为这是一个二维矩阵.
class Matrix {
valarray<double> elems;
int r, c;
public:
/* type? operator[](int r) { return ? } */
//...
}
Run Code Online (Sandbox Code Playgroud)
我想重载operator[],以便我可以得到一行矩阵,然后,我想要m[r][c]访问运算符.
有没有什么办法让一排,为的序列double使用std::slice的valarray,所以,如果我改变的值,它也是在矩阵变化?
我在valarray中读过这个定义:
std::slice_array<T> operator[]( std::slice slicearr );
Run Code Online (Sandbox Code Playgroud)
我operator[]必须有std::slice_array<double>&返回类型?
谢谢.
C++中的std :: vector是否会压缩?我的意思是我已经读过std :: vector可以将8个布尔值组合成1个字节.但是,当我在visual studio中尝试此代码时,
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<bool> array {true, false, false, true, true,false,false,true};
cout << sizeof(array) << endl;
cout << sizeof(array[0]) << endl;
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它打印:
24
16
Run Code Online (Sandbox Code Playgroud)
而在另一个IDE中,例如代码块,它打印20和8.
我不太清楚这里的布尔值.
正如标题所要求的那样,C++是否具有类似于 Python的setitem和getitem的类?
基本上它允许你做类似以下的事情.
MyClass anObject;
anObject[0] = 1;
anObject[1] = "foo";
Run Code Online (Sandbox Code Playgroud)