标签: assignment-operator

RAII和任务

我为sqlite3连接创建了以下类:

class SqliteConnection
{
public:
    sqlite3* native;

    SqliteConnection (std::string path){
        sqlite3_open_v2 (path.c_str(), &native, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
    }

    ~SqliteConnection (){
        sqlite3_close(native);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以按如下方式初始化连接

SqliteConnection conn("./database.db");
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够共享此连接,将其存储为类中的成员等,并且问题在于默认赋值运算符operator=.做点什么

SqliteConnection conn("./database.db");
SqliteConnection conn1 = conn;
Run Code Online (Sandbox Code Playgroud)

当每个变量超出范围时,会导致对数据库指针进行两次sqlite3_close调用.当您需要将资源分配给不同的变量时,如何克服RAII的这一困难?

c++ raii assignment-operator

3
推荐指数
1
解决办法
575
查看次数

具有赋值语义的非拥有者

我有一个类应该持有对某些数据的引用,而不拥有该数据(即保证实际数据不会超出范围).特别是,该类无法复制 - 数据大小容易达到几千兆字节.

现在,通常的实现(我假设)是对数据的引用:

struct holder_ref {
    type const& value;

    holder_ref(type const& value) : value(value) { }
};
Run Code Online (Sandbox Code Playgroud)

(请注意,const这个问题绝对没有关系).

现在,我绝对需要这个类可以分配(即有一个工作operator =).我认为这是一个相当普遍的问题,但我不记得(如果有的话)我之前是如何解决它的.

问题是无法分配引用,并且根本无法解决此问题.我提出的唯一解决方案是使用placement new代替赋值运算符:

// x = other_x; gets replaced with:
x.~T();
new (&x) T(other_x);
Run Code Online (Sandbox Code Playgroud)

现在,这是有效的,并且符合标准.但它肯定是丑陋的.不 - 不可接受.

所以我正在寻找其他选择.一个想法是使用指针,但我不确定我的构造函数是否确实可以保证工作(由于我必须遵守的接口,传递指针是不可能的):

struct holder_ptr {
    type const* value;

    // Is this legal?
    holder_ptr(type const& value = 0) : value(&value) { }
};
Run Code Online (Sandbox Code Playgroud)

但是,如果可能的话,我宁愿使用参考.只 - 如何实现赋值运算符?

struct holder_ref {
    type const& value;

    holder_ref(type const& value = 0) …
Run Code Online (Sandbox Code Playgroud)

c++ reference assignment-operator

3
推荐指数
1
解决办法
393
查看次数

为什么在声明对象时,构造函数和赋值运算符都没有执行?

测试程序是

#include <iostream>
using namespace std;

class A
   {public:
       A (): I(0) {cout << "default construcot" << endl; };
       explicit A (int i): I(i) {cout << "another construcot" << endl; };
       A (const A& a): I(a.I) {cout << "copy constructor" << endl; }
       A& operator = (const A& a)
          {cout << "assignment operator" << endl; 
           if (this == &a) return *this; 
           I = a.I;
           return *this; 
          }
       void show () {cout << I << endl; };
    private:
       int I;
   }; …
Run Code Online (Sandbox Code Playgroud)

c++ oop constructor assignment-operator

3
推荐指数
1
解决办法
175
查看次数

3
推荐指数
1
解决办法
441
查看次数

c:计算中使用的赋值

我有一个问题,我喜欢谷歌,但我不知道该怎么问她/她/它(谷歌:))

已经在几个示例代码中找到了这样的分配(这个特定代码这里起源于他们在网上复制了数字食谱中的代码,第54页).

我尝试在以下行中了解赋值的用法:

wr = (wtemp = wr) * wpr - wi * wpi + wr;
Run Code Online (Sandbox Code Playgroud)

就我自己对编程逻辑的理解而言,我会把它翻译成

wtemp = wr;
wr = wtemp * wpr - wi * wpi + wr;
Run Code Online (Sandbox Code Playgroud)

那是对的吗?还是应该wpr * wpr - wi [...]?或者完全不同的东西:D?

(根据维基百科,赋值运算符返回对受让人的引用,根据自由字典 - 我检查确定 - 是指定某事物的值)

c assignment-operator

3
推荐指数
1
解决办法
150
查看次数

num = + 10和num + = 10之间有什么区别?

我是java的新手,所以在试验时(正如你所知,最好的学习方法),我尝试了以下代码:

public class wHilE{
   public static void main(String[] args){
      int num = 10;
      while(num<=100){
        System.out.println("while countdown = "+ num);
        num=+10;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

它的结果是无限循环打印while countdown = 10,但是当我改变num=+10num+=10I 时,我得到了所需的结果.

为什么会这样?

java assignment-operator

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

opencv:矩阵分配混乱

任何人都可以验证/回答我的理解/问题吗?

在OpenCV中,假设

Mat A; // Suppose A has some values in it
Mat B=A;
Run Code Online (Sandbox Code Playgroud)
  1. 如果我更新B,A也会受到影响.对?它似乎基本上通过引用分配.

假设一个函数"void a_function(Mat argument){..//change argument ..}".

  1. 在你打电话给"a_function(A)"之后,A也会受到影响,对吧?

  2. 那么,为什么(或者在哪种情况下)我们需要"void a_function(Mat&argument)",如果它已经通过引用调用了?&这里可以有特殊意义吗?

  3. 如果你不希望A受到函数调用的影响,哪一个更好习惯?

    • 打电话给a_function(A.clone())
    • 通过调用a_function(A)并声明函数使用const Mat &argument并将责任留给函数?

假设您需要计算像行一样的跨行产品

L.row(i) = A.row(i).cross(B.row(i));
Run Code Online (Sandbox Code Playgroud)
  1. 在这种情况下,我可以安全地使用没有'clone()'的赋值的原因是中间结果矩阵(来自cross函数)将很快消失(?)(当退出当前本地范围时),对吧?

c++ opencv matrix assignment-operator

3
推荐指数
1
解决办法
1711
查看次数

在C++中添加互斥锁之后的struct中的赋值运算符

我有一个结构类型:

struct MyStruct {
    int field1;
    int field2;
}
Run Code Online (Sandbox Code Playgroud)

然后有必要添加一个互斥量,使其在线程之间共享:

struct MyStruct {
    std::mutex _mutex;

    int field1;
    int field2;
}
Run Code Online (Sandbox Code Playgroud)

但是然后编译器(clang)在行上给我这些消息,我将一个现有结构分配给MyStruct类型的变量,如MyStruct mystruct = p_MyStructMap->at(clientId);:

(1)错误:无法分配"MyStruct"类型的对象,因为隐式删除了其复制赋值运算符

(2)注意:'MyStruct'的复制赋值运算符被隐式删除,因为字段'_mutex'有一个删除的复制赋值运算符

std::mutex _mutex
           ^     
Run Code Online (Sandbox Code Playgroud)

(3)/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/mutex:129:12:注意:功能已在此明确标记删除

mutex& operator=(const mutex&) = delete;
       ^
Run Code Online (Sandbox Code Playgroud)

请帮助:如何重写struct或者可能是为此结构使用互斥锁的程序逻辑?

c++ struct mutex assignment-operator c++11

3
推荐指数
1
解决办法
3077
查看次数

子类可以使用其父级的asignment运算符重载吗?

我一直在问自己是否有可能创建一个基类,它具有子类可以使用的运算符重载.

示例(使用模板):

#include <cassert>

template<typename T>
struct Base {
    T value {};
    Base& operator=(const T& newVal) { this->value = newVal; return *this; }
};

template<typename T>
struct Child : Base<T> {
};

int main() {
    Child<int> ch {};
    assert(ch.value == 0);
    ch = 10;  // compilation error here
    assert(ch.value == 10);
}
Run Code Online (Sandbox Code Playgroud)

我自己尝试使用编译错误.如果我想这样做,我该怎么办?这甚至是可能的还是我必须使用虚拟并覆盖它(或任何可能的)?

错误C2679:二进制'运算符':找不到哪个运算符采用了'type'类型的右手操作数(或者没有可接受的转换)

编译器:MS Visual C++ 2015

PS:请告诉我解决方案是否使代码变得丑陋.

c++ assignment-operator c++11

3
推荐指数
1
解决办法
254
查看次数

为什么c#中的Random构造函数在方法的最后指定Seed参数?

在这里检查了.Net的Random类的源代码.令我惊讶的是最后一行

  public Random(int Seed) {
    int ii;
    int mj, mk;

    //Initialize our Seed array.
    //This algorithm comes from Numerical Recipes in C (2nd Ed.)
    int subtraction = (Seed == Int32.MinValue) ? Int32.MaxValue : Math.Abs(Seed);
    mj = MSEED - subtraction;
    SeedArray[55]=mj;
    mk=1;
    for (int i=1; i<55; i++) {  //Apparently the range [1..55] is special (Knuth) and so we're wasting the 0'th position.
      ii = (21*i)%55;
      SeedArray[ii]=mk;
      mk = mj - mk;
      if (mk<0) mk+=MBIG;
      mj=SeedArray[ii];
    }
    for (int k=1; …
Run Code Online (Sandbox Code Playgroud)

c# random redundancy assignment-operator

3
推荐指数
1
解决办法
117
查看次数