相关疑难解决方法(0)

如何实现STL样式的迭代器并避免常见的陷阱?

我创建了一个集合,我想提供一个STL风格的随机访问迭代器.我正在寻找迭代器的示例实现,但我没有找到任何.我知道需要const重载[]*运算符.迭代器有什么要求是"STL风格",还有哪些其他缺陷需要避免(如果有的话)?

附加上下文:这是一个库,除非我真的需要,否则我不想引入任何依赖.我编写自己的集合,以便能够使用相同的编译器在C++ 03和C++ 11之间提供二进制兼容性(因此没有STL可能会破坏).

c++ iterator const-iterator

286
推荐指数
5
解决办法
17万
查看次数

允许"朋友"类仅访问某些私有成员

假设我有三个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)

c++ friend

33
推荐指数
3
解决办法
2万
查看次数

定义非常量'get'成员函数的原因?

我正在使用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++ getter const member-functions

21
推荐指数
3
解决办法
943
查看次数

如何访问valarray的子​​序列,将其视为C++中的2D矩阵

我正在学习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::slicevalarray,所以,如果我改变的值,它也是在矩阵变化?

我在valarray中读过这个定义:

std::slice_array<T> operator[]( std::slice slicearr );
Run Code Online (Sandbox Code Playgroud)

operator[]必须有std::slice_array<double>&返回类型?

谢谢.

c++

6
推荐指数
1
解决办法
138
查看次数

压缩bools在C++中的std :: vector功能

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++ boolean vector

5
推荐指数
1
解决办法
589
查看次数

C++是否与Python的__setitem__等效

正如标题所要求的那样,C++是否具有类似于 Python的setitemgetitem的类?

基本上它允许你做类似以下的事情.

MyClass anObject;

anObject[0] = 1;
anObject[1] = "foo";
Run Code Online (Sandbox Code Playgroud)

c++ python

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