我为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的这一困难?
我有一个类应该持有对某些数据的引用,而不拥有该数据(即保证实际数据不会超出范围).特别是,该类无法复制 - 数据大小容易达到几千兆字节.
现在,通常的实现(我假设)是对数据的引用:
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) 测试程序是
#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) Perl的逻辑定义是否有等效的Bash运算符?类似于:
$a = $a // $b;
Run Code Online (Sandbox Code Playgroud)
要么
$a ||= $b;
Run Code Online (Sandbox Code Playgroud) 我有一个问题,我喜欢谷歌,但我不知道该怎么问她/她/它(谷歌:))
已经在几个示例代码中找到了这样的分配(这个特定代码在这里起源于他们在网上复制了数字食谱中的代码,在第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?
我是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=+10为num+=10I 时,我得到了所需的结果.
为什么会这样?
任何人都可以验证/回答我的理解/问题吗?
在OpenCV中,假设
Mat A; // Suppose A has some values in it
Mat B=A;
Run Code Online (Sandbox Code Playgroud)
假设一个函数"void a_function(Mat argument){..//change argument ..}".
在你打电话给"a_function(A)"之后,A也会受到影响,对吧?
那么,为什么(或者在哪种情况下)我们需要"void a_function(Mat&argument)",如果它已经通过引用调用了?&这里可以有特殊意义吗?
如果你不希望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)
cross函数)将很快消失(?)(当退出当前本地范围时),对吧?我有一个结构类型:
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或者可能是为此结构使用互斥锁的程序逻辑?
我一直在问自己是否有可能创建一个基类,它具有子类可以使用的运算符重载.
示例(使用模板):
#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:请告诉我解决方案是否使代码变得丑陋.
我在这里检查了.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)