2015-02-19 5 views
1

Я довольно новичок в C++ и, таким образом, пытаюсь понять, как работают указатели и ссылки. Таким образом, у меня есть простая программа, которая должна ссылаться на строку ans, возвращающую ссылку на другую строку. Я тоже не хочу копировать. Вот кодУказатели и ссылки в C++

#include <iostream> 
#include <cstdlib> 
#include <string> 

std::string& string_reverse(std::string& str){ 
    std::string rev = ""; 
    for(int i= str.length() -1; i >=0; i--){ 
    rev+=str[i]; 
    } 
    return &rev; 

} 

int main(){ 
    std::string s=""; 
    std::cout<<"Please enter a string..."<<std::endl; 
    std::cin>>s; 
    std::cout<< string_reverse(s)<<std::endl; 

} 

Однако мой код подбрасывает много ошибок. Это действительно помогло бы, если бы кто-то мог разработать различные способы, которыми это может быть сделано, и основная причина для каждого, и это правильный путь.

+2

«вернуть ссылку на другую строку» - который, будучи локальным для функции, уничтожается, прежде чем вы сможете что-либо с ним сделать. Либо вернитесь по значению, либо измените переданную строку на место и не верните ничто, или ссылку на нее. –

+2

Функция объявлена ​​для возврата ссылки, но вы пытаетесь вернуть указатель * *, адрес-оператора '&' приводит к указателю. Но есть проблемы хуже, чем после устранения этой простой проблемы, а именно, что вы возвращаете ссылку на локальную переменную, переменную, выходящую за пределы области действия после выхода из функции, и вы остаетесь с обвисшей ссылкой, и использование этого приведет к [* неопределенное поведение *] (http://en.wikipedia.org/wiki/Undefined_behavior). –

+1

Вообще говоря, вы должны включать ошибки в свой вопрос, когда задаете такие вопросы. Вы не только облегчаете читателям, но и дают им возможность научить вас, как читать ошибки, чтобы вы могли понять сами! – Hurkyl

ответ

2

Прежде всего, вы не возвращают ссылку на объем локальных переменных

std::string& string_reverse(std::string& str){ 
     //^

изменить что

std::string string_reverse(std::string& str){ 

Ссылка не может быть возвращен здесь, потому что переменная rev быть уничтожены после возвращения функции (см. также Can a local variable's memory be accessed outside its scope?).

Во-вторых вы не используете & в создать ссылку:

return &rev; 
    //^

Это займет адрес rev (то есть указатель). Вы просто написать (или для случая)

return rev; 

Последнее, но не менее вам не нужно проходить нон const ссылку для входного параметра. Лучше написать

std::string string_reverse(const std::string& str){ 
         // ^^^^^ 

если функция не изменяет str.

0

Это исправит ваши ошибки

#include <iostream> 
#include <cstdlib> 
#include <string> 

std::string string_reverse(std::string& str){ // made change here 
    std::string rev = ""; 
    for(int i= str.length() -1; i >=0; i--){ 
    rev+=str[i]; 
    } 
    return rev;  // made change here 

} 

int main(){ 
    std::string s=""; 
    std::cout<<"Please enter a string..."<<std::endl; 
    std::cin>>s; 
    std::cout<< string_reverse(s)<<std::endl; 

} 

Проблема с кодом, как это было предложено другими в том, что переменная rev будет уничтожена после того, как функция возвращает (он становится из области видимости), и ваш код причины Неопределенное поведение.

Вот некоторые ссылки, которые вы, возможно, захотите прочитать (эти ссылки могут предоставить вам больше информации, чем я могу, но вы должны иметь терпение, чтобы прочитать все это).

http://www.cs.fsu.edu/~myers/c++/notes/references.html

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

http://www.tutorialspoint.com/cplusplus/cpp_function_call_by_reference.htm

http://www.cplusplus.com/articles/z6vU7k9E/

+1

У вас нет лучших заголовков для ваших ссылок, чем просто _link1, link2, ..._? Это на самом деле не выглядит очень пытливым. –

0

Вы смешивания ссылки и addressses, избавиться от обоих, и он будет работать:

std::string string_reverse(std::string& str){ 
    std::string rev = ""; 
    for(int i= str.length() -1; i >=0; i--){ 
     rev+=str[i]; 
    } 
    return rev; 

} 
+0

Хорошо, я получил код, скомпилированный, но есть ли другой способ сделать это. Я пытаюсь лучше понять ссылку. –

+0

'rev' создается в стеке в локальной области, поэтому вы не хотите передавать ссылку на него из' string_reverse' (его область)! Любой достойный компилятор на самом деле не будет делать никаких копий, но построит базовый объект 'string', где он закончится. –

0

Фактическая ошибка заключается в том, что вы возвращаете ссылку на то, что будет уничтожено вне сферы действия.

+1

Есть больше ошибок, и код OP не возвращает ссылку, а указатель. –

Смежные вопросы