在此示例中,在引用类之前使用*运算符是什么意思

时间:2015-08-11 00:16:10

标签: c++ eclipse

Eclipse IDE在以下行中给我一个错误,"方法' get'无法解决"。确切的错误消息是

Send: //Called when button is pressed
(1) Get String from editText into MSG
(2) Run AsyncTask_SEND(MSG).executeOnExecutor(...) to send
    (this procedure avoids internet calls at main thread (NetworkOnMainThreadException))
(3) TextView.setText( TextView.getText() + "Local : " + MSG + "\n" );


Get: //Called at onCreate
Run AsyncTask_GET().executeOnExecutor(...) to get messages.
It's doInBackground works like this:
|    (1) Declare String MSG
|    (2) While client still has messages to send (kind of infinite loop):
|    |    (2.1) Get client's next line into MSG
|    |    (2.2) TextView.setText( TextView.getText() + "Remote : " + MSG + "\n" );

错误行:

Method 'get' could not be resolved, Location: line xxx, Type: Semantic Error

这里出了什么问题?这段代码是作为API提供给我的,所以大概是其他人之前使用过它。类似的错误在我给出的代码中出现了大约8次,我很难相信它在8次单独的时间以相同的方式编码错误。

问题

有人可以为我解析这一行并准确解释它想要做什么吗?
为什么我的Eclipse会为所有这些实例抛出错误以及如何修复它?

相关代码

该行存在于函数中:

const TagValue* tagValue = ((*mktDataOptions)[i]).get();

Where" TagValueListSPtr"在标题中定义为

void EClient::reqMktData(TickerId tickerId, const Contract& contract, 
const std::string& genericTicks, bool snapshot, const TagValueListSPtr& mktDataOptions)
...
    if( m_serverVersion >= MIN_SERVER_VER_LINKING) {
        std::string mktDataOptionsStr("");
        const int mktDataOptionsCount = mktDataOptions.get() ? mktDataOptions->size() : 0;
...
                const TagValue* tagValue = ((*mktDataOptions)[i]).get();

" shared_ptr"定义为

struct TagValue
{
    TagValue() {}
    TagValue(const std::string& p_tag, const std::string& p_value)
        : tag(p_tag), value(p_value)
    {}

    std::string tag;
    std::string value;
};

typedef shared_ptr<TagValue> TagValueSPtr;
typedef std::vector<TagValueSPtr> TagValueList;
typedef shared_ptr<TagValueList> TagValueListSPtr;

1 个答案:

答案 0 :(得分:1)

  

有人可以为我解析这一行并准确解释它想要做什么吗?

/* A pointer (to a const qualified TagValue) */
const TagValue*
/* named */ tagValue
/* is initialised to the result of */ = ((
/* dereferencing */ *
/* the shared pointer */ mktDataOptions)
/* which points to a vector */
/* and calling operator[] on it */ [i])
/* which returns the reference to */
/* a shared pointer to a TagValue */
/* whose */ .get();
/* member function is called, returning /*
/* as final result a pointer to a TagValue */

这实际上是一个非常复杂的设计,关于所有权(涉及很多共享指针),这就是为什么我怀疑这实际上是需要的,但很好。

mktDataOptions是指向包含TagValue的共享指针的向量的共享指针。因此,要获取指向TagValue的指针,需要使用shared_ptr::operator*()取消引用指向该向量的指针,请使用其i选择该向量的元素(std::vector::operator[]() th) 。这是指向TagValue的共享指针,因此要获取基础指针,应用成员函数shared_ptr::get()

您可以将其重写为......

// using references, otherwise you make copies,
// which changes the meaning of the code.

// Get the vector from the shared pointer
std::vector<shared_ptr<TagValue>> & the_vector = *mktDataOptions;

// get a single element from it
shared_ptr<TagValue> const & the_element = the_vector[i];

// get it's underlying pointer
TagValue * the_pointer = the_element.get();

// it's a pointer to a non const TagValue, which can be
// converted to a pointer to a const TagValue (the type of the variable
// which gets initialised)
TagValue const * tagValue = the_pointer;
  

为什么我的Eclipse会为所有这些实例抛出错误以及如何修复它?

     

[...]这是一个Eclipse错误我应该随意忽略吗?我还是想摆脱它。

从某些研究看来,它似乎是一个日食错误,可以通过删除workspace/.metadata来解决,但我需要注意的是,我不是eclipse用户,所以我无法验证或推荐一些可能的解决方案。

在您的情况下,我会复制工作区和项目目录,然后开始尝试以下建议:

但从这些问题来看,似乎这是一个相对奇怪的错误,所以准备一些挫折感。